diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x-spi.c b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x-spi.c
new file mode 100644
index 0000000..0708def
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x-spi.c
@@ -0,0 +1,86 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/err.h>
+#include <linux/spi/spi.h>
+
+/* alsa sound header */
+#include <sound/soc.h>
+#include <sound/pcm_params.h>
+
+#include "si3218x/si3218x.h"
+
+enum si3218x_spi_type {
+	MTK_EXT_PROSLIC = 0,
+	MTK_EXT_TYPE_NUM
+};
+
+struct mtk_ext_spi_ctrl {
+	int (*spi_probe)(struct spi_device *spi, struct spi_driver *spi_drv);
+	int (*spi_remove)(struct spi_device *spi);
+	const char *stream_name;
+	const char *codec_dai_name;
+	const char *codec_name;
+};
+
+static struct mtk_ext_spi_ctrl mtk_ext_list[MTK_EXT_TYPE_NUM] = {
+	[MTK_EXT_PROSLIC] = {
+		.spi_probe = si3218x_spi_probe,
+		.spi_remove = si3218x_spi_remove,
+	},
+};
+
+static unsigned int mtk_ext_type;
+
+static int mtk_ext_spi_probe(struct spi_device *spi);
+static int mtk_ext_spi_remove(struct spi_device *spi)
+{
+	dev_info(&spi->dev, "%s()\n", __func__);
+
+	if (mtk_ext_list[mtk_ext_type].spi_remove)
+		mtk_ext_list[mtk_ext_type].spi_remove(spi);
+
+	return 0;
+}
+
+static const struct of_device_id mtk_ext_match_table[] = {
+	{.compatible = "silabs,proslic_spi",},
+	{},
+};
+MODULE_DEVICE_TABLE(of, mtk_ext_match_table);
+
+static struct spi_driver mtk_ext_spi_driver = {
+	.driver = {
+		.name = "proslic_spi",
+		.owner = THIS_MODULE,
+		.of_match_table = of_match_ptr(mtk_ext_match_table),
+	},
+	.probe = mtk_ext_spi_probe,
+	.remove = mtk_ext_spi_remove,
+};
+
+module_spi_driver(mtk_ext_spi_driver);
+
+static int mtk_ext_spi_probe(struct spi_device *spi)
+{
+	int i, ret = 0;
+
+	dev_err(&spi->dev, "%s()\n", __func__);
+
+	mtk_ext_type = MTK_EXT_PROSLIC;
+	for (i = 0; i < MTK_EXT_TYPE_NUM; i++) {
+		if (!mtk_ext_list[i].spi_probe)
+			continue;
+
+		ret = mtk_ext_list[i].spi_probe(spi, &mtk_ext_spi_driver);
+		if (ret)
+			continue;
+
+		mtk_ext_type = i;
+		break;
+	}
+
+	return ret;
+}
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/Makefile b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/Makefile
new file mode 100644
index 0000000..907bb61
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/Makefile
@@ -0,0 +1,17 @@
+# Release Version 1.0.4
+# Add config define "CONFIG_SND_SOC_PROSLIC" to "y"
+# Add to Makefile of prented folder: obj-$(CONFIG_SND_SOC_PROSLIC) += proslic/
+
+# Platform
+subdir-ccflags-y += -DSI3218X
+subdir-ccflags-y += -DPROSLIC_LINUX_KERNEL
+subdir-ccflags-y += -Iinc
+subdir-ccflags-y += -Iconfig_inc
+
+
+# Basic
+snd-soc-si3218x-objs := proslic_sys_main.o proslic_sys_spi.o proslic_sys_timer.o si3218x.o proslic_spi_api.o proslic_timer_intf_linux.o
+
+obj-$(CONFIG_SND_SOC_SI3218X) += src/proslic.o src/proslic_tstin.o src/si_voice.o src/si_voice_version.o src/si3218x_intf.o src/vdaa.o src/vdaa_constants.o src/si3218x_LCCB_constants.o
+obj-$(CONFIG_SND_SOC_SI3218X) += patch_files/si3218x_patch_A_2017MAY25.o
+obj-$(CONFIG_SND_SOC_SI3218X) += snd-soc-si3218x.o
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/config_inc/proslic_api_config.h b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/config_inc/proslic_api_config.h
new file mode 100644
index 0000000..d75a2ef
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/config_inc/proslic_api_config.h
@@ -0,0 +1,210 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Author(s): 
+ * laj
+ *
+ * Distributed by: 
+ * Silicon Laboratories, Inc
+ *
+ * This file contains proprietary information.	 
+ * No dissemination allowed without prior written permission from
+ * Silicon Laboratories, Inc.
+ *
+ *
+ */
+#ifndef PROSLIC_API_CFG
+#define PROSLIC_API_CFG
+
+/** @defgroup PROSLIC_CFG ProSLIC Configuration Options
+ * @{
+ */
+
+/** @defgroup PROSLIC_DRIVER_SEL ProSLIC Driver Selection
+* Define device driver to be compiled. 
+* @{
+*/
+#ifdef PROSLIC_DOXYGEN
+#define SI3217X /**< Define to support Si3217x chipset family in the build */
+#undef SI3217X 
+#define SI3217X_REVC_ONLY /**< Define to ONLY have Si3217x Rev C support (drop Rev B support) */
+#undef SI3217X_REVC_ONLY 
+#define SI3217X_REVB_ONLY /**< Define to ONLY have Si3217x Rev B support (drop Rev C support) */
+#undef SI3217X_REVB_ONLY 
+#define SI3218X /**< Define to support Si3218x chipset family in the build */
+#undef SI3218X 
+#define SI3219X /**< Define to support Si3219x chipset family in the build */
+#undef SI3219X 
+#define SI3226X /**< Define to support Si3226x chipset family in the build */
+#undef SI3226X 
+#define SI3228X /**< Define to support Si3228x chipset family in the build */
+#undef SI3228X 
+#error DO NOT BUILD WITH PROSLIC_DOXYGEN ENABLED
+#endif
+
+/** @} PROSLIC_DRIVER_SEL*/
+
+/** @defgroup CODE_OPTS Code feature options 
+ * Select which options NOT to build - just uncomment out the undef to disable feature.
+ * @{
+ */
+#define DISABLE_VERIFY_PATCH      /**< Disable patch load verification */
+#undef DISABLE_VERIFY_PATCH 
+#define DISABLE_FSK_SETUP         /**< Disable the FSK setup & associated functions */
+#undef DISABLE_FSK_SETUP 
+#define DISABLE_TONE_SETUP        /**< Disable Tone setup API */
+#undef DISABLE_TONE_SETUP 
+#define DISABLE_RING_SETUP        /**< Disable Ring setup API */
+#undef DISABLE_RING_SETUP  
+#define DISABLE_DCFEED_SETUP      /**< Disable DC FEED setup API */
+#undef DISABLE_DCFEED_SETUP 
+#define DISABLE_GPIO_SETUP        /**< Disable GPIO setup API */
+#undef DISABLE_GPIO_SETUP 
+#define DISABLE_PCM_SETUP         /**< Disable PCM setup API */
+#undef DISABLE_PCM_SETUP 
+#define ENABLE_DEBUG              /**< Enable debug messages - function entry, etc. */
+/* #undef ENABLE_DEBUG */
+#define DISABLE_CI_SETUP          /**< Disable CI Setup */
+#undef DISABLE_CI_SETUP 
+#define DISABLE_ZSYNTH_SETUP      /**< Disable Zsyth/impedance setup */
+#undef DISABLE_ZSYNTH_SETUP  
+#define DISABLE_MALLOC            /**< Don't use MALLOC/FREE, instead assume user will statically allocate */
+#undef DISABLE_MALLOC 
+#define DISABLE_HPF_WIDEBAND      /**< Disable RX and TX HPF when in WIDEBAND mode */
+#undef DISABLE_HPF_WIDEBAND
+#define PROSLIC_OPTIMIZE_INTERRUPTS /**< Enable optimization for interrupts for dual channel devices.  This
+                                         optimization assumes channel number is on even boundaries - that is
+                                         0,2,4, are the first channel for each dual channel devices.
+                                     */
+#define ENABLE_TRACES /**< Enable this to see major API calls during software execution. NOT recommended for production code since it does add code space + can generate compiler warnings. */
+#undef ENABLE_TRACES
+
+#define SI_ENABLE_LOGGING  /**< This will enable the ability to log to a file - this assumes the application supports this.  See api_demo for example implementation */
+#undef SI_ENABLE_LOGGING 
+
+#define DISABLE_HOOKCHANGE /**< Disable ProSLIC_HookChangeDetect() and associated functions */
+#undef DISABLE_HOOKCHANGE
+
+#define DISABLE_PULSEMETERING /**< Disable pulse metering functions */
+#undef  DISABLE_PULSEMETERING
+
+/**@} */
+
+
+#define SIVOICE_NEON_MWI_SUPPORT /**< Enable NEON Message Waiting Indicator support */
+#undef SIVOICE_NEON_MWI_SUPPORT
+
+#define GCI_MODE  /**< Set if GCI vs. SPI/PCM mode is to be used */
+#undef GCI_MODE  
+
+#define ENABLE_HIRES_GAIN         /**<  Set for zsynth preset gains in dB*10 rather than dB */
+#undef  ENABLE_HIRES_GAIN         
+
+#define PRINT_TO_STRING 0         /**< Set this to 1 if printing to a string buffer vs. console - you may change/remove this*/
+
+
+/** @defgroup MULTI_BOM Multiple Device/BOM Option Support
+ * Assign patch structure names to macros used in device drivers
+* @{ */
+#define SIVOICE_MULTI_BOM_SUPPORT     /**< Enable Multiple General Configuration Support */
+#undef SIVOICE_MULTI_BOM_SUPPORT 
+
+#ifdef SIVOICE_MULTI_BOM_SUPPORT
+#define SI3217X_PATCH_B_FLBK       si3217xPatchRevBFlbk  /**< Si3217x B Flyback DCDC Converter patch */
+#define SI3217X_PATCH_B_BKBT       si3217xPatchRevBBkbt  /**< Si3217x B Buck-boost DCDC Converter patch */
+#define SI3217X_PATCH_B_PBB        si3217xPatchRevBBkbt  /**< Si3217x B PMOS Buck-boost DCDC Converter patch */
+#define SI3217X_PATCH_B_LCQCUK     si3217xPatchRevBFlbk  /**< Si3217x C Quasi-CUK DCDC Converter patch */
+#define SI3217X_PATCH_C_FLBK       si3217xPatchRevCFlbk  /**< Si3217x C Flyback DCDC Converter patch */
+#define SI3217X_PATCH_C_BKBT       si3217xPatchRevCFlbk  /**< Si3217x C Buck-boost DCDC Converter patch */
+#define SI3217X_PATCH_C_PBB        si3217xPatchRevCFlbk  /**< Si3217x C PMOS Buck-boost DCDC Converter patch */
+#define SI3217X_PATCH_C_LCQCUK     si3217xPatchRevCFlbk  /**< Si3217x C Quasi-CUK DCDC Converter patch */
+
+#define SI3218X_PATCH_A            si3218xPatchRevALCQC  /**< Si3218x LCQC 5W DCDC Converter patch */
+
+#define SI3219X_PATCH_A            si3219xPatchRevALCQC  /**< SI3219x patch */
+
+#define SI3226X_PATCH_C_FLBK       si3226xPatchRevCFlbk    /**< Si3226x RevC Flyback DCDC Converter Patch */
+#define SI3226X_PATCH_C_CUK        si3226xPatchRevCFlbk    /**< Si3226x RevC Full CUK DCDC Converter Patch */
+#define SI3226X_PATCH_C_QCUK       si3226xPatchRevCFlbk    /**< Si3226x RevC Quasi-CUK DCDC Converter Patch */
+#define SI3226X_PATCH_C_LCQCUK     si3226xPatchRevCFlbk    /**< Si3226x RevC Low-cost QCUK DCDC Converter Patch */
+#define SI3226X_PATCH_C_TSS        si3226xPatchRevCTss     /**< Si3226x RevC TSS DCDC Converter Patch */
+#define SI3226X_PATCH_C_TSS_ISO    si3226xPatchRevCTssIso  /**< Si3226x RevC TSS (isolated) DCDC Converter Patch */
+#define SI3226X_PATCH_C_PBB        si3226xPatchRevCFlbk    /**< Si3226x PMOS Buck-boost DCDC Converter patch */   
+#define SI3226x_PATCH_C_FIXRL      SI3226X_PATCH_C_TSS
+#define SI3226X_PATCH_C_QSS        si3226xPatchRevCTss     /**< Si3226x RevC QSS DCDC Converter Patch */
+#define SI3226X_PATCH_C_BB         si3226xPatchRevCFlbk    /**< Si3226x BJT Buck-boost DCDC Converter patch */   
+
+#define SI3228X_PATCH_A            si3228xPatchRevALCQC  /**< Si3228x LCQC 5W DCDC Converter patch */
+
+#endif
+
+/* Default patch names for backwards compatibility */
+#define SI3217X_PATCH_B_DEFAULT    RevBPatch
+#define SI3217X_PATCH_C_DEFAULT    RevCPatch
+#define SI3218X_PATCH_A_DEFAULT    RevAPatch
+#define SI3219X_PATCH_A_DEFAULT    RevAPatch
+#define SI3226X_PATCH_C_DEFAULT    RevCPatch
+#define SI3228X_PATCH_A_DEFAULT    RevAPatch
+
+/** @} MULTI_BOM */
+
+
+#include <linux/module.h>
+#define LOGPRINT(...) printk(KERN_ERR __VA_ARGS__)
+#ifdef SI_ENABLE_LOGGING
+
+#ifdef PROSLIC_LINUX_KERNEL
+#error "Logging currently implemented only for userspace programs."
+#endif
+
+extern FILE *SILABS_LOG_FP; /* This global variable would need to be initialized by the user's program - see the api demo for example */
+#endif /* SI_ENABLE_LOGGING */
+
+#ifdef ENABLE_DEBUG
+#define DEBUG_ENABLED(X) ((X)->debugMode & 1)
+
+#ifdef SI_ENABLE_LOGGING
+#define DEBUG_PRINT(CHPTR,...) if( DEBUG_ENABLED(CHPTR) ){ fprintf(SILABS_LOG_FP, __VA_ARGS__); fflush(SILABS_LOG_FP);}
+#else
+#define DEBUG_PRINT(CHPTR,...) if( DEBUG_ENABLED(CHPTR) ) LOGPRINT(__VA_ARGS__)
+#endif /* Logging */
+
+#else /* No Debug */
+/* Handled in si_voice.h */
+#endif
+#define SI_ENABLE_LOGGING
+#ifdef ENABLE_TRACES
+#define TRACE_ENABLED(X) ((X)->debugMode & 2)
+
+#ifdef SI_ENABLE_LOGGING
+#define TRACEPRINT(CHPTR,FMT,...) if(TRACE_ENABLED(CHPTR)) {fprintf(SILABS_LOG_FP, "#TRC:%s channel: %d "FMT,__FUNCTION__, (CHPTR)->channel,__VA_ARGS__); fflush(SILABS_LOG_FP); }
+#define TRACEPRINT_NOCHAN(FMT,...) fprintf(SILABS_LOG_FP, "#TRC:%s "FMT,__FUNCTION__, __VA_ARGS__); fflush(SILABS_LOG_FP)
+#else
+#define TRACEPRINT(CHPTR,FMT,...) if(TRACE_ENABLED(CHPTR)) LOGPRINT("TRC:%s channel: %d "FMT,__FUNCTION__, (CHPTR)->channel,__VA_ARGS__)
+#define TRACEPRINT_NOCHAN(FMT,...) LOGPRINT("TRC:%s "FMT,__FUNCTION__, __VA_ARGS__)
+
+#endif /* SI_ENABLE_LOGGING */
+#else
+/* Handled in si_voice.h */
+#endif
+
+
+/** @defgroup PSTN_CFG PSTN Detection Options
+* @{ */
+#define PSTN_DET_ENABLE                  /**< Define to include Differential PSTN detection code */
+#undef PSTN_DET_ENABLE
+
+#define PSTN_DET_OPEN_FEMF_SETTLE   1500     /**< OPEN foreign voltage measurement settle time */
+#define PSTN_DET_DIFF_SAMPLES       4        /**< Number of I/V samples averaged [1 to 16] */
+#define PSTN_DET_MIN_ILOOP          700      /**< Minimum acceptable loop current */
+#define PSTN_DET_MAX_FEMF           10000    /**< Maximum OPEN state foreign voltage */
+#define PSTN_DET_POLL_RATE          10       /**< Rate of re-entrant code in ms */
+#define PSTN_DET_DIFF_IV1_SETTLE    1000     /**< Settle time before first I/V measurment in ms */
+#define PSTN_DET_DIFF_IV2_SETTLE    1000     /**< Settle time before first I/V measurment in ms */
+
+/** @} PSTN_CFG */
+#define SIVOICE_CFG_NEWTYPES_ONLY  1 /**< Set if not supporting Legacy types */
+
+
+/**@} */
+#endif
+
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/config_inc/si3218x_LCCB_constants.h b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/config_inc/si3218x_LCCB_constants.h
new file mode 100644
index 0000000..94bdac1
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/config_inc/si3218x_LCCB_constants.h
@@ -0,0 +1,83 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ *
+ * Si3218x ProSLIC API Configuration Tool Version 4.2.1
+ * Last Updated in API Release: 9.2.0
+ * source XML file: si3218x_LCCB_constants.xml
+ *
+ * Auto generated file from configuration tool.
+ */
+
+
+#ifndef SI3218X_CONSTANTS_H
+#define SI3218X_CONSTANTS_H
+
+/** Ringing Presets */
+enum {
+	DEFAULT_RINGING,
+	RING_F20_45VRMS_0VDC_LPR,
+	RINGING_LAST_ENUM
+};
+
+/** DC_Feed Presets */
+enum {
+	DCFEED_48V_20MA,
+	DCFEED_48V_25MA,
+	DCFEED_PSTN_DET_1,
+	DCFEED_PSTN_DET_2,
+	DC_FEED_LAST_ENUM
+};
+
+/** Impedance Presets */
+enum {
+	ZSYN_600_0_0_30_0,
+	ZSYN_270_750_150_30_0,
+	ZSYN_370_620_310_30_0,
+	ZSYN_220_820_120_30_0,
+	ZSYN_600_0_1000_30_0,
+	ZSYN_200_680_100_30_0,
+	ZSYN_220_820_115_30_0,
+	WB_ZSYN_600_0_0_20_0,
+	IMPEDANCE_LAST_ENUM
+};
+
+/** FSK Presets */
+enum {
+	DEFAULT_FSK,
+	ETSI_FSK,
+	FSK_LAST_ENUM
+};
+
+/** Pulse_Metering Presets */
+enum {
+	DEFAULT_PULSE_METERING,
+	PULSE_METERING_LAST_ENUM
+};
+
+/** Tone Presets */
+enum {
+	TONEGEN_FCC_DIAL,
+	TONEGEN_FCC_BUSY,
+	TONEGEN_FCC_RINGBACK,
+	TONEGEN_FCC_REORDER,
+	TONEGEN_FCC_CONGESTION,
+	TONEGEN_FCC_CAS,
+	TONEGEN_FCC_SAS,
+	TONEGEN_ETSI_DTAS,
+	TONEGEN_1004,
+	TONE_LAST_ENUM
+};
+
+/** PCM Presets */
+enum {
+	PCM_8ULAW,
+	PCM_8ALAW,
+	PCM_16LIN,
+	PCM_16LIN_WB,
+	PCM_LAST_ENUM
+};
+
+
+
+#endif
+
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/config_inc/si_voice_datatypes.h b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/config_inc/si_voice_datatypes.h
new file mode 100644
index 0000000..520a79d
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/config_inc/si_voice_datatypes.h
@@ -0,0 +1,60 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * si_voice_datatypes.h
+ * ProSLIC datatypes file
+ *
+ * Author(s): 
+ * laj
+ *
+ * Distributed by: 
+ * Silicon Laboratories, Inc
+ *
+ * This file contains proprietary information.	 
+ * No dissemination allowed without prior written permission from
+ * Silicon Laboratories, Inc.
+ *
+ * File Description:
+ * This is the header file that contains
+ * type definitions for the data types
+ * used in the demonstration code.
+ *
+ */
+#ifndef DATATYPES_H
+#define DATATYPES_H
+#include "proslic_api_config.h"
+
+#ifndef TRUE
+#define TRUE (1)
+#endif
+#ifndef FALSE
+#define FALSE (0)
+#endif
+
+#ifndef NULL
+#define NULL ((void *) 0)
+#endif
+
+#include <linux/types.h>
+typedef u_int8_t            BOOLEAN;
+typedef int8_t              int8;
+typedef u_int8_t            uInt8;
+typedef uInt8               uChar;
+typedef int16_t             int16;
+typedef u_int16_t           uInt16;
+typedef int32_t             int32;
+typedef u_int32_t           uInt32;
+typedef u_int32_t           ramData;
+
+
+#include <linux/slab.h>
+#include <linux/kernel.h> /* for abs() */
+/* NOTE: kcalloc was introduced in ~2.6.14, otherwise use kzalloc() with (X)*(Y) for the block size */
+#define SIVOICE_CALLOC(X,Y)   kcalloc((X),(Y), GFP_KERNEL)
+#define SIVOICE_FREE(X)       kfree((X))
+#define SIVOICE_MALLOC(X)     kmalloc((X), GFP_KERNEL)
+#define SIVOICE_STRCPY        strcpy
+#define SIVOICE_STRNCPY       strncpy
+#define SIVOICE_MEMSET        memset
+#define SIVOICE_ABS           abs
+#endif
+
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/config_inc/vdaa_api_config.h b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/config_inc/vdaa_api_config.h
new file mode 100644
index 0000000..4967170
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/config_inc/vdaa_api_config.h
@@ -0,0 +1,42 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * vdaa_api_config.h
+ * VoiceDAA header config file
+ *
+ * Author(s): 
+ * naqamar, laj
+ *
+ * Distributed by: 
+ * Silicon Laboratories, Inc
+ *
+ * This file contains proprietary information.	 
+ * No dissemination allowed without prior written permission from
+ * Silicon Laboratories, Inc.
+ *
+ * File Description:
+ * This file is used 
+ * in the VoiceDAA demonstration code. 
+ *
+ *
+ */
+
+#ifndef VDAA_API_CFG_H
+#define VDAA_API_CFG_H
+
+/* #define DISABLE_MALLOC */
+/* #define DISABLE_VDAA_RING_DETECT_SETUP */
+/* #define DISABLE_VDAA_AUDIO_GAIN_SETUP */
+/* #define DISABLE_VDAA_PCM_SETUP */
+/* #define DISABLE_VDAA_COUNTRY_SETUP */
+/* #define DISABLE_VDAA_HYBRID_SETUP */
+#define DISABLE_VDAA_LOOPBACK_SETUP
+#define DISABLE_VDAA_IMPEDANCE_SETUP
+
+#ifndef ENABLE_DEBUG
+#define ENABLE_DEBUG
+#endif
+//#include "stdio.h"
+#include <linux/kernel.h>
+//#define LOGPRINT printf
+
+#endif
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/config_inc/vdaa_constants.h b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/config_inc/vdaa_constants.h
new file mode 100644
index 0000000..11940a6
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/config_inc/vdaa_constants.h
@@ -0,0 +1,57 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Si3217x ProSLIC API Configuration Tool Version 4.2.1
+ * Last Updated in API Release: 9.2.0
+ * source XML file: si3217x_FLBK_GDRV_constants.xml
+ *
+ * Auto generated file from configuration tool.
+*/
+
+
+#ifndef VDAA_CONSTANTS_H
+#define VDAA_CONSTANTS_H
+
+/** Vdaa_Country Presets */
+enum {
+	COU_USA,
+	COU_GERMANY,
+	COU_CHINA,
+	COU_AUSTRALIA,
+	VDAA_COUNTRY_LAST_ENUM
+};
+
+/** Vdaa_Audio_Gain Presets */
+enum {
+	AUDIO_GAIN_0DB,
+	AUDIO_ATTEN_4DB,
+	AUDIO_ATTEN_6DB,
+	AUDIO_ATTEN_11DB,
+	VDAA_AUDIO_GAIN_LAST_ENUM
+};
+
+/** Vdaa_Ring_Validation Presets */
+enum {
+	RING_DET_NOVAL_LOWV,
+	RING_DET_VAL_HIGHV,
+	VDAA_RING_VALIDATION_LAST_ENUM
+};
+
+/** Vdaa_PCM Presets */
+enum {
+	DAA_PCM_8ULAW,
+	DAA_PCM_8ALAW,
+	DAA_PCM_16LIN,
+	VDAA_PCM_LAST_ENUM
+};
+
+/** Vdaa_Hybrid Presets */
+enum {
+	HYB_600_0_0_500FT_24AWG,
+	HYB_270_750_150_500FT_24AWG,
+	HYB_200_680_100_500FT_24AWG,
+	HYB_220_820_120_500FT_24AWG,
+	VDAA_HYBRID_LAST_ENUM
+};
+
+#endif
+
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/inc/proslic.h b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/inc/proslic.h
new file mode 100644
index 0000000..a85c342
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/inc/proslic.h
@@ -0,0 +1,2697 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Distributed by:
+ * Silicon Laboratories, Inc
+ *
+ * This file contains proprietary information.
+ * No dissemination allowed without prior written permission from
+ * Silicon Laboratories, Inc.
+ *
+ * File Description:
+ * This is the header file for the ProSLIC driver.
+ *
+ */
+
+#ifndef PROSLIC_H
+#define PROSLIC_H
+
+/*include all the required headers*/
+#include "../config_inc/proslic_api_config.h"
+#include "../config_inc/si_voice_datatypes.h"
+#include "../inc/si_voice_ctrl.h"
+#include "../inc/si_voice_timer_intf.h"
+#include "../inc/si_voice.h"
+
+
+/* UNSORTED ADDITIONS - These common parameters have been moved from
+   the drivers to here to support simultaneous compile of multiple devices
+   */
+/* Patch Parameters */
+#define PATCH_NUM_LOW_ENTRIES       8
+#define PATCH_NUM_HIGH_ENTRIES      8
+#define PATCH_MAX_SUPPORT_RAM       128
+#define PATCH_MAX_SIZE              1024
+
+#define PROSLIC_RAM_MADC_VBAT   3
+#define PROSLIC_RAM_PATCHID         448
+#define PROSLIC_RAM_VERIFY_IO       449
+#define PROSLIC_RAM_PD_DCDC         1538
+#define PROSLIC_RAM_PRAM_ADDR       1358
+#define PROSLIC_RAM_PRAM_DATA       1359
+#define PATCH_JMPTBL_HIGH_ADDR      1597
+
+/* Common register values for 17x, 26x, 18x, 19x & 28x */
+#define PROSLIC_REG_ID              0
+#define PROSLIC_REG_RESET           1
+#define PROSLIC_REG_MSTRSTAT        3
+#define PROSLIC_REG_RAM_ADDR_HI     5
+#define PROSLIC_REG_PCMMODE         11
+#define PROSLIC_REG_PCMTXLO         12
+#define PROSLIC_REG_PCMTXHI         13
+#define PROSLIC_REG_PCMRXLO         14
+#define PROSLIC_REG_PCMRXHI         15
+#define PROSLIC_REG_IRQ             16
+#define PROSLIC_REG_IRQ0            17
+#define PROSLIC_REG_IRQ1            18
+#define PROSLIC_REG_IRQ4            21
+#define PROSLIC_REG_IRQEN1          22
+#define PROSLIC_REG_IRQEN2          23
+#define PROSLIC_REG_IRQEN3          24
+#define PROSLIC_REG_IRQEN4          25
+#define PROSLIC_REG_CALR0           26
+#define PROSLIC_REG_CALR3           29
+#define PROSLIC_REG_LINEFEED        30
+#define PROSLIC_REG_POLREV          31
+#define PROSLIC_REG_LCRRTP          34
+#define PROSLIC_REG_RINGCON         38
+#define PROSLIC_REG_RINGTALO        39
+#define PROSLIC_REG_RINGTAHI        40
+#define PROSLIC_REG_RINGTILO        41
+#define PROSLIC_REG_RINGTIHI        42
+#define PROSLIC_REG_LOOPBACK        43
+#define PROSLIC_REG_DIGCON          44
+#define PROSLIC_REG_ZCAL_EN         46
+#define PROSLIC_REG_ENHANCE         47
+#define PROSLIC_REG_OMODE           48
+#define PROSLIC_REG_OCON            49
+#define PROSLIC_REG_O1TALO          50
+#define PROSLIC_REG_O1TAHI          51
+#define PROSLIC_REG_O1TILO          52
+#define PROSLIC_REG_O1TIHI          53
+#define PROSLIC_REG_O2TALO          54
+#define PROSLIC_REG_O2TAHI          55
+#define PROSLIC_REG_O2TILO          56
+#define PROSLIC_REG_O2TIHI          57
+#define PROSLIC_REG_FSKDAT          58
+#define PROSLIC_REG_FSKDEPTH        59
+#define PROSLIC_REG_TONDTMF         60
+#define PROSLIC_REG_USERSTAT        66
+#define PROSLIC_REG_GPIO            67
+#define PROSLIC_REG_PMCON           75
+#define PROSLIC_REG_AUTORD          80
+#define PROSLIC_REG_JMPEN           81
+#define PATCH_JMPTBL_START_ADDR     82
+#define PATCH_JMPTBL_LOW_ADDR       82
+#define PROSLIC_REG_USERMODE_ENABLE 126
+
+/* Common RAM locations for most ProSLICs */
+#define PROSLIC_RAM_OSC1FREQ        26
+#define PROSLIC_RAM_OSC1AMP         27
+#define PROSLIC_RAM_OSC1PHAS        28
+#define PROSLIC_RAM_OSC2FREQ        29
+#define PROSLIC_RAM_OSC2AMP         30
+#define PROSLIC_RAM_OSC2PHAS        31
+#define PROSLIC_RAM_SLOPE_RING      637
+#define PROSLIC_RAM_V_VLIM              640
+#define PROSLIC_RAM_VOV_RING_BAT    753
+#define PROSLIC_RAM_RTPER           755
+#define PROSLIC_RAM_VBATR_EXPECT    768
+#define PROSLIC_RAM_FSKFREQ0        834
+#define PROSLIC_RAM_FSKFREQ1        835
+#define PROSLIC_RAM_FSKAMP0         836
+#define PROSLIC_RAM_FSKAMP1         837
+#define PROSLIC_RAM_FSK01           838
+#define PROSLIC_RAM_FSK10           839
+#define PROSLIC_RAM_RINGOF          843
+#define PROSLIC_RAM_RINGFR          844
+#define PROSLIC_RAM_RINGAMP         845
+#define PROSLIC_RAM_RTDCTH          847
+#define PROSLIC_RAM_RTACTH          848
+#define PROSLIC_RAM_RTDCDB          849
+#define PROSLIC_RAM_LCRMASK         854
+#define PROSLIC_RAM_IRING_LIM       860
+#define PROSLIC_RAM_VOV_RING_GND    896
+#define PROSLIC_RAM_MWI_V           914
+#define PROSLIC_RAM_DCDC_OITHRESH_LO    1006
+#define PROSLIC_RAM_DCDC_OITHRESH_HI    1007
+#define PROSLIC_RAM_CMDAC_FWD           1476
+#define PROSLIC_RAM_CMDAC_REV           1477
+#define PROSLIC_RAM_CAL_TRNRD_DACT  1458
+#define PROSLIC_RAM_CAL_TRNRD_DACR  1459
+#define PROSLIC_RAM_RDC_SUM         1499
+#define PROSLIC_RAM_DCDC_STATUS     1551
+#define PROSLIC_RAM_DCDC_RNGTYPE    1560
+
+#define PROSLIC_CHAN_BROADCAST          0xFF
+
+/* BOM Constants */
+#define BOM_KAUDIO_PM               0x8000000L
+#define BOM_KAUDIO_NO_PM            0x3A2E8BAL
+#define BOM_AC_ADC_GAIN_PM          0x151EB80L
+#define BOM_AC_ADC_GAIN_NO_PM       0x99999AL
+#define FIXRL_VDC_SCALE             0xAE924B9L  /** vdc sense scale when using fixed-rail */
+
+/* Generic Constants */
+#define COMP_5V                     0x51EB82L
+#define VBATL_13V                   0xF00000L
+#define COMP_10V                    0xA3D705L
+#define ZCAL_V_RASUM_IDEAL_VAL      0x8F00000L
+#define ZCAL_DC_DAC_OS_VAL          0x1FFE0000L
+
+/* MADC Constants */
+#define SCALE_V_MADC                1074      /* 1/(1000*931.32e-9)  mV */
+#define SCALE_I_MADC                597       /* 1/(1e6*1.676e-9)    uA */
+#define SCALE_P_MADC				2386	  /* 1/(1e3*419.095e-9)  mW */
+#define SCALE_R_MADC                1609      /* 1/(1e3*621.554e-9)  mV */
+
+/* Calibration Constants */
+#define CAL_LB_CMDAC                0x0C
+#define CAL_LB_TRNRD                0x03
+#define CAL_LB_ALL                  0x0F
+#define TIMEOUT_MADC_CAL            100
+#define TIMEOUT_GEN_CAL             300
+#define TIMEOUT_LB_CAL              2410
+
+/* MWI Constants */
+#define SIL_MWI_USTAT_SET           0x04
+#define SIL_MWI_USTAT_CLEAR         0xFB
+#define SIL_MWI_VPK_MAX             110
+#define SIL_MWI_VPK_MAX_LO          95
+#define SIL_MWI_VPK_MIN             80
+#define SIL_MWI_LCRMASK_MAX         2000
+#define SIL_MWI_LCRMASK_MIN         5
+#define SIL_MWI_LCRMASK_SCALE       65536
+#define SIL_MWI_FLASH_OFF           0
+#define SIL_MWI_FLASH_ON            1
+
+/* Depricated functions now mapped directly to SiVoice versions... */
+
+#define ProSLIC_clearErrorFlag                   SiVoice_clearErrorFlag
+#define ProSLIC_createChannel                    SiVoice_createChannel
+#define ProSLIC_createControlInterface           SiVoice_createControlInterface
+#define ProSLIC_createDevice                     SiVoice_createDevice
+#define ProSLIC_destroyChannel                   SiVoice_destroyChannel
+#define ProSLIC_destroyControlInterface          SiVoice_destroyControlInterface
+#define ProSLIC_destroyDevice                    SiVoice_destroyDevice
+#define ProSLIC_getChannelEnable                 SiVoice_getChannelEnable
+#define ProSLIC_getErrorFlag                     SiVoice_getErrorFlag
+#define ProSLIC_Reset                            SiVoice_Reset
+#define ProSLIC_setChannelEnable                 SiVoice_setChannelEnable
+#define ProSLIC_setControlInterfaceCtrlObj       SiVoice_setControlInterfaceCtrlObj
+#define ProSLIC_setControlInterfaceDelay         SiVoice_setControlInterfaceDelay
+#define ProSLIC_setControlInterfaceGetTime       SiVoice_setControlInterfaceGetTime
+#define ProSLIC_setControlInterfaceReadRAM       SiVoice_setControlInterfaceReadRAM
+#define ProSLIC_setControlInterfaceReadRegister  SiVoice_setControlInterfaceReadRegister
+#define ProSLIC_setControlInterfaceReset         SiVoice_setControlInterfaceReset
+#define ProSLIC_setControlInterfaceSemaphore     SiVoice_setControlInterfaceSemaphore
+#define ProSLIC_setControlInterfaceTimeElapsed   SiVoice_setControlInterfaceTimeElapsed
+#define ProSLIC_setControlInterfaceTimerObj      SiVoice_setControlInterfaceTimerObj
+#define ProSLIC_setControlInterfaceWriteRAM      SiVoice_setControlInterfaceWriteRAM
+#define ProSLIC_setControlInterfaceWriteRegister SiVoice_setControlInterfaceWriteRegister
+#define ProSLIC_setSWDebugMode                   SiVoice_setSWDebugMode
+#define ProSLIC_SWInitChan                       SiVoice_SWInitChan
+#define ProSLIC_Version                          SiVoice_Version
+#define ProSLIC_ReadReg                          SiVoice_ReadReg
+#define ProSLIC_WriteReg                         SiVoice_WriteReg
+#define ProSLIC_ShutdownChannel                  ProSLIC_PowerDownConverter
+#define ProSLIC_MWISetup(PCHAN,VPK,LCR)          ProSLIC_MWISetV(PCHAN,VPK)
+#define ProSLIC_MWI                              ProSLIC_MWISetState
+
+#define SI_MAX_INTERRUPTS 4
+
+#define PROSLIC_EXTENDED_GAIN_MAX 9
+#define PROSLIC_GAIN_MAX 6
+#define PROSLIC_GAIN_MIN -30
+/*
+** Initialization Sequence Location - Used by 18x & 17x
+*/
+typedef enum
+{
+  INIT_SEQ_BEGINNING,
+  INIT_SEQ_READ_ID,
+  INIT_SEQ_PRE_PATCH_LOAD,
+  INIT_SEQ_POST_PATCH_LOAD,
+  INIT_SEQ_PRE_CAL,
+  INIT_SEQ_POST_CAL,
+  INIT_SEQ_END
+} initSeqType;
+
+/** @mainpage
+ * This document is a supplement to the ProSLIC API User Guide.  It has most
+ * of the APIs documented and hyperlinked.
+ *
+ * This document has the following tabs:
+ *
+ * - Main Page (this page) - introduction to the document.
+ * - Related pages - mainly the deprecated list is located here.
+ *  Although these identifiers are present in the current release, they are
+ *  targeted for deletion in a future release.  Any existing customer code
+ *  using deprecated identifiers should be modified as indicated.
+ * - Modules - this is the meat of the document - this has each functional group in outline format listed here.
+ * - Data Structures - This has every data structure listed in in the ProSLIC API in alphabetical order.
+ * - Files - this has the source files in hyperlink format.  @note In some cases the hyperlink generator will not properly
+ *  generate the correct reference or not be able to find it.  In this case please use an alternative method.
+ *
+ */
+
+/** @defgroup PROSLIC_TYPES ProSLIC General Datatypes/Function Definitions
+ * This section documents functions and data structures related to the
+ * ProSLIC/FXS chipsets.
+ * @{
+ */
+
+/*
+* ----------------ProSLIC Generic DataTypes/Function Definitions----
+**********************************************************************
+*/
+
+#define MAX_PROSLIC_IRQS 32 /**< How many interrupts are supported in the ProSLIC */
+
+#ifdef ENABLE_DEBUG
+#define PROSLIC_PRINT_ERROR(CHAN, ERROR)\
+  LOGPRINT("%sError encountered on channel: %d fault code: %d\n",\
+    LOGPRINT_PREFIX, (CHAN)->channel, (ERROR))
+#else
+#define PROSLIC_PRINT_ERROR(CHAN, ERROR)
+#endif
+
+/**********************************************************************/
+/**
+* Map Proslic types to SiVoice types
+*/
+typedef SiVoiceControlInterfaceType controlInterfaceType; /**< Map ProSLIC to SiVoice type */
+typedef SiVoiceControlInterfaceType proslicControlInterfaceType; /**< Map ProSLIC to SiVoice type */
+typedef SiVoiceDeviceType ProslicDeviceType; /**< Map ProSLIC to SiVoice type */
+typedef SiVoiceChanType proslicChanType; /**< Map ProSLIC to SiVoice type */
+
+/**
+* Define channel and device type pointers
+*/
+typedef ProslicDeviceType
+*proslicDeviceType_ptr; /**< Shortcut for pointer to a ProSLIC device type */
+typedef proslicChanType
+*proslicChanType_ptr; /**< Shortcut for pointer to a ProSLIC channel type */
+
+/** @} PROSLIC_TYPES */
+
+/** @addtogroup HC_DETECT
+ * @{
+ */
+/**
+* This is structure used to store pulse dial information
+*/
+typedef struct {
+	uInt8 currentPulseDigit;
+	void *onHookTime; /**< Timestamp for when the onhook detection occured */
+	void *offHookTime; /**< Timestamp for when the offhook detection occured */
+} pulseDialType;
+
+/**
+* Defines structure for configuring pulse dial detection
+*/
+typedef struct {
+	uInt8 minOnHook; /**< Min mSec for onhook */
+	uInt8 maxOnHook; /**< Max mSec for onhook */
+	uInt8 minOffHook; /**< Min mSec for offhook */
+	uInt8 maxOffHook; /**< Max mSec for offhook */
+} pulseDial_Cfg;
+/** @} PD_DETECT */
+
+/**
+* This is structure used to store pulse dial information
+*/
+#define SI_HC_NO_ACTIVITY     0x10
+#define SI_HC_NEED_MORE_POLLS 0x20
+#define SI_HC_ONHOOK_TIMEOUT  0x41
+#define SI_HC_OFFHOOK_TIMEOUT 0x42
+#define SI_HC_HOOKFLASH       0x43
+
+#define SI_HC_NONDIGIT_DONE(X) ((X) & 0x40)
+#define SI_HC_DIGIT_DONE(X)    ((X) && ((X) < 11))
+
+typedef struct
+{
+  uInt8 currentPulseDigit;
+  uInt8 last_hook_state;
+  uInt8 lookingForTimeout;
+  uInt8 last_state_reported;
+  void *hookTime; /**< Timestamp for when the onhook detection occurred */
+} hookChangeType;
+
+/**
+* Defines structure for configuring hook change detection.  Times are in mSec.
+*/
+typedef struct
+{
+  uInt16 minOnHook; /**< Min mSec for onhook/break time  */
+  uInt16 maxOnHook; /**< Max mSec for onhook/break time  */
+  uInt16 minOffHook; /**< Min mSec for offhook/make time */
+  uInt16 maxOffHook; /**< Max mSec for offhook/make time */
+  uInt16 minInterDigit; /**< Minimum interdigit time */
+  uInt16 minHookFlash; /**< minimum hook flash time */
+  uInt16 maxHookFlash; /**< maximum hook flash time */
+  uInt16 minHook; /**< Minimum hook time, which should be >> than maxHookFlash */
+} hookChange_Cfg;
+/** @} HC_DETECT*/
+
+
+/** @addtogroup PROSLIC_INTERRUPTS
+ * @{
+ */
+/**
+* Interrupt tags
+*/
+
+/* MAINTAINER NOTE: if this enum changes, update interrupt.c in the API demo */
+typedef enum
+{
+  IRQ_OSC1_T1,
+  IRQ_OSC1_T2,
+  IRQ_OSC2_T1,
+  IRQ_OSC2_T2,
+  IRQ_RING_T1,
+  IRQ_RING_T2,
+  IRQ_PM_T1,
+  IRQ_PM_T2,
+  IRQ_FSKBUF_AVAIL, /**< FSK FIFO depth reached */
+  IRQ_VBAT,
+  IRQ_RING_TRIP, /**< Ring Trip detected */
+  IRQ_LOOP_STATUS,  /**< Loop Current changed */
+  IRQ_LONG_STAT,
+  IRQ_VOC_TRACK,
+  IRQ_DTMF,         /**< DTMF Detected - call @ref ProSLIC_DTMFReadDigit to decode the value */
+  IRQ_INDIRECT,     /**< Indirect/RAM access completed */
+  IRQ_TXMDM,
+  IRQ_RXMDM,
+  IRQ_PQ1,          /**< Power alarm 1 */
+  IRQ_PQ2,          /**< Power alarm 2 */
+  IRQ_PQ3,          /**< Power alarm 3 */
+  IRQ_PQ4,          /**< Power alarm 4 */
+  IRQ_PQ5,          /**< Power alarm 5 */
+  IRQ_PQ6,          /**< Power alarm 6 */
+  IRQ_RING_FAIL,
+  IRQ_CM_BAL,
+  IRQ_USER_0,
+  IRQ_USER_1,
+  IRQ_USER_2,
+  IRQ_USER_3,
+  IRQ_USER_4,
+  IRQ_USER_5,
+  IRQ_USER_6,
+  IRQ_USER_7,
+  IRQ_DSP,
+  IRQ_MADC_FS,
+  IRQ_P_HVIC,
+  IRQ_P_THERM, /**< Thermal alarm */
+  IRQ_P_OFFLD
+} ProslicInt;
+
+/**
+* Defines structure of interrupt data - used by @ref ProSLIC_GetInterrupts
+*/
+typedef struct
+{
+  ProslicInt
+  *irqs; /**< Pointer of an array of size MAX_PROSLIC_IRQS (this is to be allocated by the caller) */
+  uInt8 number; /**< Number of IRQs detected/pending */
+} proslicIntType;
+
+
+/** @} PROSLIC_INTERRUPTS */
+
+/** @addtogroup TONE_GEN
+ * @{
+ */
+/**
+* Defines structure for configuring 1 oscillator - see your data sheet for specifics or use the configuration
+* tool to have this filled in for you.
+*/
+typedef struct
+{
+  ramData freq;
+  ramData amp;
+  ramData phas;
+  uInt8 talo;
+  uInt8 tahi;
+  uInt8 tilo;
+  uInt8 tihi;
+} Oscillator_Cfg;
+
+/**
+ * Defines structure for tone configuration.
+ */
+typedef struct
+{
+  Oscillator_Cfg osc1;
+  Oscillator_Cfg osc2;
+  uInt8 omode;
+} ProSLIC_Tone_Cfg;
+
+typedef struct
+{
+  ramData fsk[2];
+  ramData fskamp[2];
+  ramData fskfreq[2];
+  uInt8 eightBit;
+  uInt8 fskdepth;
+} ProSLIC_FSK_Cfg;
+/** @} TONE_GEN */
+
+/*****************************************************************************/
+/** @addtogroup SIGNALING
+ * @{
+ */
+/**
+* Hook states - returned by @ref ProSLIC_ReadHookStatus()
+*/
+enum
+{
+  PROSLIC_ONHOOK, /**< Hook state is onhook */
+  PROSLIC_OFFHOOK /**< Hook state is offhook */
+};
+
+#ifndef SIVOICE_CFG_NEWTYPES_ONLY
+enum
+{
+  ONHOOK = PROSLIC_ONHOOK, /**< @deprecated- Please use PROSLIC_ONHOOK and PROSLIC_OFFHOOK for future code development */
+  OFFHOOK = PROSLIC_OFFHOOK
+};
+#endif
+
+/** @} SIGNALING */
+
+/*****************************************************************************/
+/** @addtogroup PCM_CONTROL
+ * @{
+* Loopback modes
+*/
+typedef enum
+{
+  PROSLIC_LOOPBACK_NONE, /**< Loopback disabled */
+  PROSLIC_LOOPBACK_DIG,  /**< Loopback is toward the PCM side */
+  PROSLIC_LOOPBACK_ANA   /**< Loopback is toward the analog side */
+} ProslicLoopbackModes;
+
+/**
+* Mute options - which direction to mute
+*/
+typedef enum
+{
+  PROSLIC_MUTE_NONE = 0,  /**< Don't mute */
+  PROSLIC_MUTE_RX = 0x1,  /**< Mute toward the RX side */
+  PROSLIC_MUTE_TX = 0x2,  /**< Mute toward the TX side */
+  PROSLIC_MUTE_ALL = 0x3  /**< Mute both directions */
+} ProslicMuteModes;
+
+/** @} PCM_CONTROL */
+
+/*****************************************************************************/
+/** @addtogroup GAIN_CONTROL
+ * @{
+* Path Selector
+*/
+enum
+{
+  TXACGAIN_SEL = 0,
+  RXACGAIN_SEL = 1
+};
+
+
+/*
+** Defines structure for configuring audio gain on the fly
+*/
+typedef struct
+{
+  ramData acgain;
+  uInt8 mute;
+  ramData aceq_c0;
+  ramData aceq_c1;
+  ramData aceq_c2;
+  ramData aceq_c3;
+} ProSLIC_audioGain_Cfg;
+
+/** @} GAIN_CONTROL */
+
+/*****************************************************************************/
+/** @addtogroup LINESTATUS
+ * @{
+ */
+/**
+* enumeration of the Proslic polarity reversal states - used by ProSLIC_PolRev API
+*/
+enum
+{
+  POLREV_STOP, /**< Stop Polarity reversal */
+  POLREV_START, /**< Start Polarity reversal */
+  WINK_START, /**< Start Wink */
+  WINK_STOP /**< Stop Wink */
+};
+
+/**
+* Defines initialization data structures
+* Linefeed states - used in @ref ProSLIC_SetLinefeedStatus and @ref ProSLIC_SetLinefeedStatusBroadcast
+*/
+enum
+{
+  LF_OPEN,          /**< Open circuit */
+  LF_FWD_ACTIVE,    /**< Forward active */
+  LF_FWD_OHT,       /**< Forward active, onhook transmission (used for CID/VMWI) */
+  LF_TIP_OPEN,      /**< Tip open */
+  LF_RINGING,       /**< Ringing */
+  LF_REV_ACTIVE,    /**< Reverse battery/polarity reversed, active */
+  LF_REV_OHT,       /**< Reverse battery/polarity reversed, active, onhook transmission (used for CID/VMWI) */
+  LF_RING_OPEN      /**< Ring open */
+} ;
+/** @} LINESTATUS */
+
+
+
+
+/*****************************************************************************/
+/** @addtogroup GEN_CFG
+ * @{
+ */
+
+/**
+* Defines initialization data structures
+*/
+typedef struct
+{
+  uInt8 address;
+  uInt8 initValue;
+} ProslicRegInit;
+
+typedef struct
+{
+  uInt16 address;
+  ramData initValue;
+} ProslicRAMInit;
+
+/**
+* ProSLIC patch object
+*/
+typedef struct
+{
+  const ramData *patchData; /**< 1024 max*/
+  const uInt16 *patchEntries; /**< 8 max */
+  const uInt32 patchSerial;
+  const uInt16 *psRamAddr;  /**< 128 max */
+  const ramData *psRamData; /**< 128 max */
+} proslicPatch;
+
+/** @} GEN_CFG */
+
+
+/*****************************************************************************/
+/** @addtogroup RING_CONTROL
+ * @{
+ */
+/**
+* Ringing type options
+* Ringing type options - Trapezoidal w/ a Crest factor CF11= Crest factor 1.1 or sinusoidal.
+*/
+typedef enum
+{
+  ProSLIC_RING_TRAP_CF11,
+  ProSLIC_RING_TRAP_CF12,
+  ProSLIC_RING_TRAP_CF13,
+  ProSLIC_RING_TRAP_CF14,
+  ProSLIC_RING_TRAP_CF15,
+  ProSLIC_RING_TRAP_CF16,
+  ProSLIC_RING_SINE /***< Plain old sinusoidal ringing */
+} ProSLIC_RINGTYPE_T;
+
+/**
+* Ringing (provisioned) object
+*/
+typedef struct
+{
+  ProSLIC_RINGTYPE_T
+  ringtype;  /**< Is this a sinusoid or a trapezoidal ring shape? */
+  uInt8 freq;                   /**< In terms of Hz */
+  uInt8 amp;                    /**< in terms of 1 volt units */
+  uInt8 offset;                 /**< In terms of 1 volt units */
+} ProSLIC_dbgRingCfg;
+
+
+/** @} RING_CONTROL */
+
+/*****************************************************************************/
+/**
+* Line Monitor - returned by @ref ProSLIC_LineMonitor
+*/
+typedef struct
+{
+  int32  vtr;		/**< Voltage, tip-ring in mV */
+  int32  vtip;	/**< Voltage, tip-ground in mV */
+  int32  vring;	/**< Voltage, ring-ground in mV */
+  int32  vbat;	/**< Voltage, battery in mV */
+  int32  vdc;		/**< Voltage, Vdc in mV */
+  int32  vlong;	/**< Voltage, longitudinal in mV */
+  int32  itr;		/**< Loop current, in uA tip-ring */
+  int32  itip;	/**< Loop current, in uA tip */
+  int32  iring;	/**< Loop current, in uA ring */
+  int32  ilong;	/**< Loop current, in uA longitudinal */
+  int32  p_hvic;  /**< On-chip Power Calculation in mw */
+} proslicMonitorType;
+
+/*****************************************************************************/
+/** @addtogroup PROSLIC_DCFEED
+ * @{
+ */
+/**
+* Powersave
+*/
+enum
+{
+  PWRSAVE_DISABLE = 0, /**< Disable power savings mode */
+  PWRSAVE_ENABLE  = 1   /**< Enable power savings mode */
+};
+
+/**
+** DC Feed Preset
+*/
+typedef struct
+{
+  ramData slope_vlim;
+  ramData slope_rfeed;
+  ramData slope_ilim;
+  ramData delta1;
+  ramData delta2;
+  ramData v_vlim;
+  ramData v_rfeed;
+  ramData v_ilim;
+  ramData const_rfeed;
+  ramData const_ilim;
+  ramData i_vlim;
+  ramData lcronhk;
+  ramData lcroffhk;
+  ramData lcrdbi;
+  ramData longhith;
+  ramData longloth;
+  ramData longdbi;
+  ramData lcrmask;
+  ramData lcrmask_polrev;
+  ramData lcrmask_state;
+  ramData lcrmask_linecap;
+  ramData vcm_oh;
+  ramData vov_bat;
+  ramData vov_gnd;
+} ProSLIC_DCfeed_Cfg;
+
+/** @} PROSLIC_DCFEED */
+
+/*****************************************************************************/
+/** @defgroup ProSLIC_API ProSLIC API
+* proslic.c function declarations
+* @{
+*/
+
+/*****************************************************************************/
+/** @defgroup DIAGNOSTICS Diagnostics
+ * The functions in this group allow one to monitor the line state for abnormal
+ * situations.
+ * @{
+ */
+
+/**
+* Test State - used in polled tests (such as PSTN Check)
+*/
+typedef struct
+{
+  int32 stage;               /**< What state is the test in */
+  int32 waitIterations;      /**< How many iterations to stay in a particular state */
+  int32 sampleIterations;    /**< How many  samples have been collected */
+} proslicTestStateType;
+
+/**
+ * @brief
+ *  This function allows one to monitor the instantaneous voltage and
+ *  loop current values seen on tip/ring.
+ *
+ *  @param[in] pProslic - which channel should the data be collected from
+ *  @param[in,out] *monitor -  the data collected
+ *  @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ */
+
+int ProSLIC_LineMonitor(proslicChanType_ptr pProslic,
+                        proslicMonitorType *monitor);
+
+/**
+ * @brief
+ *  This function reads the MADC a scaled value
+ *
+ *  @param[in] pProslic - which channel should the data be collected from
+ *  @param[in] addr  - address to read from (MADC_ILOOP, MADC_ITIP, etc).
+ *  @param[in] scale  - scale to use (0 = determine based upon MADC address)
+ *  @retval int32 - scaled value requested or -1 if not supported.
+ *
+ */
+
+int32 ProSLIC_ReadMADCScaled(proslicChanType_ptr pProslic, uInt16 addr,
+                             int32 scale);
+
+/** @defgroup PSTN_CHECK PSTN Check
+ * Monitor for excessive longitudinal current, which
+ * would be present if a live pstn line was connected
+ * to the port.  To operate these sets of functions:
+ *
+ * - Iniitalize the PSTN object by calling @ref ProSLIC_InitPSTNCheckObj
+ * - Poll at a constant rate and call @ref ProSLIC_PSTNCheck.  Check the return code of this function.
+ *
+ * Alternatively, you can call the DiffPSTNCheck versions of the above two functions.
+ *
+ * @note These functions may be disabled by doing a undef of @ref PSTN_DET_ENABLE in the configuration file.
+ * @{
+*/
+#define MAX_ILONG_SAMPLES 32 /**< How many samples to collect for PSTN check */
+#define MAX_PSTN_SAMPLES 16 /**< Used in the PSTN check status code to indicate the number of samples to collect */
+
+/**
+* FEMF OPEN voltage test enable
+*/
+enum
+{
+  FEMF_MEAS_DISABLE, /**< Do not measure FEMF as part of PSTN Check */
+  FEMF_MEAS_ENABLE   /**< Do measure FEMF as part of PSTN Check */
+};
+
+/** Standard line interfaces */
+typedef struct
+{
+  int32   avgThresh;
+  int32   singleThresh;
+  int32   ilong[MAX_ILONG_SAMPLES];
+  uInt8   count;
+  uInt8   samples;
+  int32   avgIlong;
+  BOOLEAN buffFull;
+} proslicPSTNCheckObjType;
+
+typedef proslicPSTNCheckObjType *proslicPSTNCheckObjType_ptr;
+
+
+/** Re-Injection line interfaces (differential) */
+typedef struct
+{
+  proslicTestStateType pState;
+  int dcfPreset1;
+  int dcfPreset2;
+  int entryDCFeedPreset;
+  uInt8 lfstate_entry;
+  uInt8 enhanceRegSave;
+  uInt8 samples;
+  int32 vdiff1[MAX_PSTN_SAMPLES];
+  int32 vdiff2[MAX_PSTN_SAMPLES];
+  int32 iloop1[MAX_PSTN_SAMPLES];
+  int32 iloop2[MAX_PSTN_SAMPLES];
+  int32 vdiff1_avg;
+  int32 vdiff2_avg;
+  int32 iloop1_avg;
+  int32 iloop2_avg;
+  int32 rl1;
+  int32 rl2;
+  int32 rl_ratio;
+  int femf_enable;
+  int32 vdiff_open;
+  int32 max_femf_vopen;
+  int return_status;
+} proslicDiffPSTNCheckObjType;
+
+typedef proslicDiffPSTNCheckObjType *proslicDiffPSTNCheckObjType_ptr;
+
+/** @}PSTN_CHECK */
+/** @}DIAGNOSTICS */
+/*****************************************************************************/
+/*
+** proslic.c function declarations
+*/
+
+/*****************************************************************************/
+/** @defgroup GEN_CFG General configuration
+ * @{
+ */
+
+/**
+ * @brief
+ *  Loads patch and initializes all ProSLIC devices. Performs all calibrations except
+ *  longitudinal balance.
+ *
+ * @param[in] hProslic - which channel(s) to initialize, if size > 1, then the start of the array
+ * of channels to be initialized.
+ * @param[in] size - the number of channels to initialize.
+ * @param[in] preset - general configuration preset to apply
+ *
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ * @sa ProSLIC_Init
+ */
+
+int ProSLIC_Init_MultiBOM (proslicChanType_ptr *hProslic, int size, int preset);
+
+/**
+ * @brief
+ *  Loads patch and initializes all ProSLIC devices. Performs all calibrations except
+ *  longitudinal balance.
+ *
+ * @param[in] hProslic - which channel(s) to initialize, if size > 1, then the start of the array
+ * of channels to be initialized.
+ * @param[in] size - the number of channels to initialize.
+ *
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int ProSLIC_Init (proslicChanType_ptr *hProslic, int size);
+
+/**
+ * @brief
+ *  Loads patch and initializes all ProSLIC devices. 
+ *
+ * @param[in] hProslic - which channel(s) to initialize, if size > 1, then the start of the array
+ * of channels to be initialized.
+ * @param[in] size - the number of channels to initialize. 
+ * @param[in] option - see initOptionsType
+ *
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int ProSLIC_Init_with_Options (proslicChanType_ptr *hProslic, int size,
+                               int option);
+
+/**
+ * @brief
+ *  Performs soft reset then calls ProSLIC_Init()
+ *
+ * @param[in] hProslic - which channel(s) to re-initialize.
+ * of channels to be initialized.
+ * @param[in] size - the number of channels to initialize. 
+ *
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int ProSLIC_Reinit (proslicChanType_ptr *hProslic, int size);
+
+/**
+ * @brief
+ * Loads registers and RAM in the ProSLICs specified.
+ *
+ * @param[in] pProslic - array of channels
+ * @param[in] pRamTable - array of RAM locations and values to write
+ * @param[in] pRegTable - array of register locations and values to write
+ * @param[in] bcast- is broadcast enabled.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @note This function should NOT be used since it can bypass the standard initialization/operational state of the
+ * ProSLIC.
+ */
+
+int ProSLIC_LoadRegTable (proslicChanType      *pProslic,
+                          const ProslicRAMInit *pRamTable, 
+                          const ProslicRegInit *pRegTable, 
+                          int bcast);
+
+/**
+ * @brief
+ * Loads registers and RAM in the ProSLICs specified.
+ *
+ * @param[in] pProslic - array of channels
+ * @param[in] pRamTable - array of RAM locations and values to write
+ * @param[in] pRegTable - array of register locations and values to write
+ * @param[in] size - number of ProSLICS to write to.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @note This function should NOT be used since it can bypass the standard initialization/operational state of the
+ * ProSLIC.
+ */
+
+int ProSLIC_LoadRegTables (proslicChanType_ptr *pProslic,
+                           const ProslicRAMInit *pRamTable, const ProslicRegInit *pRegTable, int size);
+
+/**
+ * @brief
+ * Implement soft reset. For dual channel devices, you can specify a hard reset
+ * (which impacts both channels) or if the channel is actually the second 
+ * channel.  The default is to do a soft reset on the 1st channel.
+ *
+ * @param[in] hProslic - which channel to reset
+ * @param[in] resetOptions - PROSLIC_HARD_RESET (dual channel devices ONLY) | PROSLIC_SOFT_RESET_SECOND_CHAN (dual channel devices) | PROSLIC_BCAST_RESET | PROSLIC_SOFT_RESET
+ *
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @note Will abort reset if in free run mode.
+ * @note Only perform a soft reset on 1 channel at a time.
+ */
+ 
+#define PROSLIC_BCAST_RESET 0x8000
+#define PROSLIC_HARD_RESET 3
+#define PROSLIC_SOFT_RESET_SECOND_CHAN 2
+#define PROSLIC_SOFT_RESET 1
+
+int ProSLIC_SoftReset(proslicChanType_ptr hProslic, uInt16 resetOptions);
+
+/**
+ * @brief
+ *  Configure impedance synthesis
+ *
+ * @param[in] hProslic - which channel to configure
+ * @param[in] preset - which impedance configuration to load from the constants file.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @note This function can be disabled by @ref DISABLE_ZSYNTH_SETUP
+ */
+
+int ProSLIC_ZsynthSetup (proslicChanType_ptr hProslic,int preset);
+
+/**
+ * @brief
+ *  This function configures the CI bits (GCI mode)
+ *
+ * @param[in] hProslic - which channel to configure
+ * @param[in] preset - which GCI preset to use from the constants file
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @note This function can be disabled by @ref DISABLE_CI_SETUP
+ */
+#ifndef DISABLE_CI_SETUP
+int ProSLIC_GciCISetup (proslicChanType_ptr hProslic,int preset);
+#endif
+
+/*****************************************************************************/
+/** @defgroup PROSLIC_DEBUG Debug
+ * This group of functions enables/disables debug messages as well as dump
+ * register contents.
+ * @{
+ */
+
+
+/**
+ * @brief
+ * This function allows access to SPI read RAM function pointer from interface
+ *
+ * @param[in] pProslic - pointer to channel structure
+ * @param[in] addr - address to read
+ * @retval ramData - RAM contents
+ *
+ */
+ramData ProSLIC_ReadRAM (proslicChanType *pProslic, uInt16 addr);
+
+/**
+ * @brief
+ * This function allows access to SPI write RAM function pointer from interface
+ *
+ * @param[in] pProslic - pointer to channel structure
+ * @param[in] addr - address to write
+ * @param[in] data to be written
+ * @retval int - @ref RC_NONE
+ *
+ */
+int ProSLIC_WriteRAM (proslicChanType *pProslic, uInt16 addr, ramData data);
+
+/**
+ * @brief
+ * This function dumps to console the register contents of several
+ * registers and RAM locations.
+ *
+ * @param[in] pProslic - which channel to dump the register contents of.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ */
+int ProSLIC_PrintDebugData (proslicChanType *pProslic);
+
+/**
+ * @brief
+ * This function dumps the registers to the console using whatever
+ * I/O method is defined by LOGPRINT
+ *
+ * @param[in] pProslic - which channel to dump the register contents of.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ */
+int ProSLIC_PrintDebugReg (proslicChanType *pProslic);
+
+/**
+ * @brief
+ * This function dumps the RAM to the console using whatever
+ * I/O method is defined by LOGPRINT
+ *
+ * @param[in] pProslic - which channel to dump the RAM contents of.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ */
+int ProSLIC_PrintDebugRAM (proslicChanType *pProslic);
+
+/** @} PROSLIC_DEBUG */
+/*****************************************************************************/
+/** @defgroup PROSLIC_ENABLE Enable/disable channels (for init)
+ * @{
+ */
+
+/**
+ * @brief
+ *  This function sets the channel enable status of the FXO channel on ProSLIC devices
+ *  with integrated FXO.  If NOT set, then when
+ *  the various initialization routines such as @ref SiVoice_SWInitChan is called,
+ *  then this particular channel will NOT be initialized.
+ *
+ *  This function does not access the chipset directly, so SPI/GCI
+ *  does not need to be up during this function call.
+ *
+ * @param[in,out] pProslic - which channel to return the status.
+ * @param[in] enable - The new value of the channel enable field. 0 = NOT enabled, 1 = enabled.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @sa ProSLIC_getChannelEnable
+ */
+
+int ProSLIC_SetDAAEnable(proslicChanType *pProslic, int enable);
+
+/** @} PROSLIC_ENABLE */
+
+/*****************************************************************************/
+/** @defgroup PROSLIC_PATCH Patch management.
+ * This group of functions write and verify the patch data needed by the
+ * ProSLIC chipset.
+ * @{
+ */
+
+/**
+ * @brief
+ * Calls patch loading function for a particular channel/ProSLIC
+ *
+ * @param[in] hProslic - which channel/ProSLIC should be patched
+ * @param[in] pPatch - the patch data
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @note This function should not be called directly under normal circumstances since the initialization function should
+ *       perform this operation.
+ *
+ * @sa ProSLIC_Init
+ */
+
+int ProSLIC_LoadPatch (proslicChanType_ptr hProslic,const proslicPatch *pPatch);
+
+/**
+ * @brief
+ *  Verifies patch loading function for a particular channel/ProSLIC
+ *
+ * @param[in] hProslic - which channel/ProSLIC should be patched
+ * @param[in] pPatch - the patch data to verify was written to.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @note This function should not be called directly under normal circumstances since the initialization function should
+ *       perform this operation, unless @ref DISABLE_VERIFY_PATCH is defined.
+ *
+ * @sa ProSLIC_Init
+ */
+
+int ProSLIC_VerifyPatch (proslicChanType_ptr hProslic,const proslicPatch *pPatch);
+
+/** @} PROSLIC_PATCH */
+
+/*****************************************************************************/
+/** @defgroup PROSLIC_GPIO GPIO Control
+ * This group of functions configure, read and write the GPIO status pins.
+ * @{
+ */
+
+/**
+ * @brief
+ *  This function configures the ProSLIC GPIOs by loading a gpio preset that was
+ *  set in the configuration tool.
+ * @param[in] hProslic - which channel to configure the GPIO pins.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ * @sa ProSLIC_GPIOControl
+ */
+
+int ProSLIC_GPIOSetup (proslicChanType_ptr hProslic);
+
+/**
+ * @brief
+ *  This function controls the GPIOs of the ProSLIC.
+ *
+ * @param[in] hProslic - which channel to modify
+ * @param[in,out] pGpioData  - pointer to GPIO status (typically 1 byte)
+ * @param[in] read - 1 = Read the status, 0 = write the status
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ * @sa ProSLIC_GPIOSetup
+ */
+
+int ProSLIC_GPIOControl (proslicChanType_ptr hProslic,uInt8 *pGpioData,
+                         uInt8 read);
+
+/** @} PROSLIC_GPIO */
+/** @} GEN_CFG */
+
+/*****************************************************************************/
+/** @defgroup PROSLIC_PULSE_METER Pulse Metering
+ *
+ * This group contains functions related to pulse metering.
+ * @{
+ */
+
+/**
+* @brief
+*  This function configures the ProSLIC pulse metering by loading a pulse metering preset.
+*
+* @param[in] hProslic - which channel should be configured
+* @param[in] preset - which preset to load from the defined settings made in the configuration tool.
+* @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+*
+* @sa ProSLIC_PulseMeterStart ProSLIC_PulseMeterStop
+*/
+
+int ProSLIC_PulseMeterSetup (proslicChanType_ptr hProslic,int preset);
+
+/**
+ * @brief
+ *  This function enables the pulse metering generator.
+ *
+ * @param[in] hProslic - which channel should play the tone.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ * @sa ProSLIC_PulseMeterSetup ProSLIC_PulseMeterStop ProSLIC_PulseMeterDisable
+ *
+ */
+int ProSLIC_PulseMeterEnable (proslicChanType_ptr hProslic);
+
+/**
+ * @brief
+ *  This function disables the pulse metering generator..
+ *
+ * @param[in] hProslic - which channel should play the tone.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ * @sa ProSLIC_PulseMeterSetup ProSLIC_PulseMeterStop ProSLIC_PulseMeterEnable
+ *
+ */
+
+int ProSLIC_PulseMeterDisable (proslicChanType_ptr hProslic);
+
+/**
+ * @brief
+ *  This function starts the pulse metering tone.
+ *
+ * @param[in] hProslic - which channel should play the tone.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ * @sa ProSLIC_PulseMeterSetup ProSLIC_PulseMeterStop
+ *
+ */
+
+int ProSLIC_PulseMeterStart (proslicChanType_ptr hProslic);
+
+/**
+ * @brief
+ *  This function stops the pulse metering tone.
+ *
+ * @param[in] hProslic - which channel should play the tone.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ * @sa PProSLIC_PulseMeterStart ProSLIC_PulseMeterSetup
+ *
+ */
+
+int ProSLIC_PulseMeterStop (proslicChanType_ptr hProslic);
+
+/** @} PROSLIC_PULSE_METER */
+
+/*****************************************************************************/
+/** @defgroup PROSLIC_INTERRUPTS Interrupt control and decode
+ * @{
+ */
+
+/**
+ * @brief
+ *  Enables interrupts configured in the general configuration data structure.
+ *
+ * @param[in]  hProslic - which channel to enable the interrupts.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ */
+
+int ProSLIC_EnableInterrupts (proslicChanType_ptr hProslic);
+
+/**
+ * @brief
+ *  This function reads the interrupts from the ProSLIC and places them into
+ *  a @ref proslicIntType structure which contains up to @ref MAX_PROSLIC_IRQS
+ *  interrupts.
+ *
+ * @param[in] hProslic - which channel to enable the interrupts.
+ * @param[in,out] pIntData - this structure contains the interrupts pending and the number of interrupts.
+ * @retval int - number of interrupts pending or RC_CHANNEL_TYPE_ERR if wrong chip type or 0 for no interrupts.
+ *
+ */
+
+int ProSLIC_GetInterrupts (proslicChanType_ptr hProslic,
+                           proslicIntType *pIntData);
+
+/**
+ * @brief
+ *  This function disables and clears interrupts on the given channel.
+ *
+ *  @param[in] hProslic - which channel to disable
+ *  @retval int - error from @ref errorCodeType @ref RC_NONE indicates no error.
+ */
+
+int ProSLIC_DisableInterrupts (proslicChanType_ptr hProslic);
+
+/** @} PROSLIC_INTERRUPTS */
+
+/*****************************************************************************/
+/** @defgroup SIGNALING Signaling - ring & line state, and hook state
+ * @{
+ */
+
+/**
+* Function: PROSLIC_ReadHookStatus
+*
+* @brief
+* Determine hook status
+* @param[in] hProslic - which channel to read from.
+* @param[out] *pHookStat - will contain either @ref PROSLIC_ONHOOK or @ref PROSLIC_OFFHOOK
+*
+*/
+
+int ProSLIC_ReadHookStatus (proslicChanType_ptr hProslic,uInt8 *pHookStat);
+
+/*****************************************************************************/
+/** @defgroup LINESTATUS Line Feed status
+ * @{
+ */
+
+/**
+ * @brief
+ *  This function sets the linefeed state.
+ *
+ * @param[in] hProslic - which channel to modify
+ * @param[in] newLinefeed - new line feed state  - examples: LF_OPEN, LF_FWD_ACTIVE
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int ProSLIC_SetLinefeedStatus (proslicChanType_ptr hProslic,uInt8 newLinefeed);
+
+/**
+ * @brief
+ *  This function sets the linefeed state for all channels on the same daisychain.
+ *
+ * @param[in] hProslic - which channel to modify
+ * @param[in] newLinefeed - new line feed state  - examples: LF_OPEN, LF_FWD_ACTIVE
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int ProSLIC_SetLinefeedStatusBroadcast (proslicChanType_ptr hProslic,
+                                        uInt8 newLinefeed);
+
+/**
+ * @brief
+ *  This function sets the polarity/wink state of the channel.
+ *
+ * @param[in] hProslic - which channel to modify
+ * @param[in] abrupt  - to change the state immediately
+ * @param[in] newPolRevState - new polarity state  - examples: POLREV_STOP, POLREV_START and WINK_START
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int ProSLIC_PolRev (proslicChanType_ptr hProslic,uInt8 abrupt,
+                    uInt8 newPolRevState);
+
+/** @} LINESTATUS */
+
+/*****************************************************************************/
+/** @defgroup RING_CONTROL Ring generation
+ * @{
+ */
+
+/**
+ * @brief
+ *  Configure the ringer to the given preset (see your constants header file for exact value to use).
+ *  This includes timing, cadence, OHT mode, voltage levels, etc.
+ *
+ * @param[in]  hProslic - which channel to configure
+ * @param[in]  preset - which of the xxxx_Ring_Cfg structures to use to configure the channel.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @note This function can be compiled out by defining @ref DISABLE_RING_SETUP
+ *
+ * @sa ProSLIC_dbgSetRinging ProSLIC_RingStart ProSLIC_RingStop
+ */
+
+int ProSLIC_RingSetup (proslicChanType_ptr hProslic,int preset);
+
+/**
+ * @brief
+ *  Starts the ringer as confgured by @ref ProSLIC_RingSetup .  If the active and inactive timers are enabled,
+ *  the ProSLIC will automatically turn on/off the ringer as programmed, else one will need to
+ *  manually implement the ring cadence.  In either case, one will need to call ProSLIC_RingStop to
+ *  stop the ringer or one may call @ref ProSLIC_SetLinefeedStatus to change the state directly.
+ *
+ * @param[in]  hProslic - which channel to enable ringing.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @note This function can be compiled out by defining @ref DISABLE_RING_SETUP
+ * @deprecated - Will become a macro in a future release and later removed.  Customers should just call ProSLIC_SetLinefeedStatus w/ LF_RINGING.
+ *
+ * @sa ProSLIC_dbgSetRinging ProSLIC_RingStop ProSLIC_RingSetup
+ */
+
+int ProSLIC_RingStart (proslicChanType_ptr hProslic);
+
+/**
+ * @brief
+ *  Stop the ringer on the given channel and set the line state to forward active.
+ * @deprecated  - Will become a macro in a future release.  Customers should just call ProSLIC_SetLinefeedStatus w/ LF_FWD_ACTIVE.
+ *
+ * @param[in] hProslic - which channel to modify.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ * @sa ProSLIC_RingSetup ProSLIC_RingStart
+ *
+ * @deprecated customers are encouraged to use ProSLIC_SetLinefeedStatus
+ */
+
+int ProSLIC_RingStop (proslicChanType_ptr hProslic);
+
+/**
+ * @brief
+ *  Provision function for setting up Ring type, frequency, amplitude and dc offset and
+ *  to store them in the given preset.
+ *
+ * @note: This function calculates the values, it does not set them.
+ * @note: This code assumes ProSLIC_RingSetup() was called earlier with the highest ringer
+ *        requirements (possibly during initialization).  After that, this function can 
+ *        be used for meeting provisioning requirements.
+ *
+ * @param[in] pProslic - which channel to modify
+ * @param[in] ringCfg - how to configure the channel's ringer
+ * @param[in] preset - where to store the new configuration.
+ * @sa ProSLIC_RingSetup ProSLIC_RingStart ProSLIC_RingStop
+ */
+
+int ProSLIC_dbgSetRinging (proslicChanType *pProslic,
+                           ProSLIC_dbgRingCfg *ringCfg, int preset);
+
+/** 
+ * @brief
+ * Enable abrupt ringing. Normally the ProSLIC would perform a smooth transistion
+ * to start the ring signal, but in cases where a delay is not acceptable, this 
+ * function disables this feature.
+ *
+ * @param[in] pProslic - which channel to modify
+ * @param[in] isEnabled - is the abrupt ringing enbaled (smooth transistion disabled).
+ * 
+ * @note Not all chipsets support this feature.
+ *
+ */
+
+int ProSLIC_EnableFastRingStart(proslicChanType_ptr pProslic, BOOLEAN isEnabled);
+
+/** @} RING_CONTROL */
+/** @} SIGNALING */
+
+/*****************************************************************************/
+/** @defgroup PROSLIC_AUDIO Audio
+ * This group of functions contains routines to configure the PCM bus, to generate tones, and to send FSK data.
+ *
+ * In order to start using the PCM bus, you would typically initialize the PCM bus with code similar to
+ * the following:
+ *
+ * @code
+ * if( (ProSLIC_PCMSetup(myProSLIC, MY_COMPANDING) != RC_NONE)
+ * 	|| (ProSLIC_PCMTimeSlotSetup(myProSLIC, pcm_ts, pcm_ts) != RC_NONE)
+ * 	|| (ProSLIC_PCMStart(myProSLIC) != RC_NONE))
+ * {
+ * 	return MY_PCM_INIT_ERROR;
+ * }
+ * @endcode
+ *
+ * @{
+ * @defgroup TONE_GEN Tone generation
+ * This group of functions is related to playing out general tones - such as dial tone, busy tone, etc.  One would
+ * typically call @ref ProSLIC_ToneGenSetup first followed by @ref ProSLIC_ToneGenStart and after some time, a call to
+ * @ref ProSLIC_ToneGenStop to stop the tone.  The direction of the tone and cadence (if any) are configured using the
+ * GUI configuration tool's TONE dialog box and then saved in the constants file.
+ *
+ * @{
+ */
+/**
+ * @brief
+ *  Configure the tone generator to the given preset (see your constants header file for exact value to use).  It does NOT
+ *  play a particular tone out.
+ *
+ * @warning If @ref ProSLIC_FSKSetup was called earlier, this function will need to be called again.
+ *
+ * @param[in]  hProslic - which channel to configure
+ * @param[in]  preset - which of the xxxx_Tone_Cfg structures to use to configure the channel.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @note This function can be compiled out by defining @ref DISABLE_TONE_SETUP.
+ *
+ * @note Typically, if one is using the ProSLIC for tone generation, you will be calling this function prior to each call
+ *       into @ref ProSLIC_ToneGenStart so that the correct tone is played out.
+ */
+
+int ProSLIC_ToneGenSetup (proslicChanType_ptr hProslic,int preset);
+
+/**
+ * @brief
+ *  Configure the tone generator to the given preset (see your constants header file for exact value to use).  It does NOT
+ *  play a particular tone out.
+ *
+ * @warning If @ref ProSLIC_FSKSetup was called earlier, this function will need to be called again.
+ *
+ * @param[in]  pProslic - which channel to configure
+ * @param[in]  cfg - which of the xxxx_Tone_Cfg structures to use to configure the channel.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @note This function can be compiled out by defining @ref DISABLE_TONE_SETUP.
+ *
+ * @note Typically, if one is using the ProSLIC for tone generation, you will be calling this function prior to each call
+ *       into @ref ProSLIC_ToneGenStart so that the correct tone is played out.
+ */
+
+int ProSLIC_ToneGenSetupPtr(proslicChanType_ptr pProslic,
+                            ProSLIC_Tone_Cfg *cfg);
+
+/**
+ * @brief
+ *  This function starts the tone configured by @ref ProSLIC_ToneGenSetup.
+ *  It is assumed that the @ref PROSLIC_AUDIO setup was performed
+ *  prior to calling this function.  Also, it is suggested that
+ *  @ref ProSLIC_ToneGenSetup be called if @ref FSK_CONTROL
+ *  functions were used.
+ *
+ *  @param[in] hProslic - which channel should play the tone.
+ *  @param[in] timerEn - are the timers to be enabled?  1 = Yes, 0 = No. When in doubt, set to 1.
+ *  @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @sa ProSLIC_ToneGenSetup ProSLIC_ToneGenStop
+ */
+
+int ProSLIC_ToneGenStart (proslicChanType_ptr hProslic, uInt8 timerEn);
+
+/**
+ * @brief
+ *  This function turns off tone generation initiated by @ref ProSLIC_ToneGenStart.
+ *
+ * @param[in] hProslic - which channel should stop playing the tone.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @sa ProSLIC_ToneGenStart ProSLIC_ToneGenSetup
+ */
+
+int ProSLIC_ToneGenStop (proslicChanType_ptr hProslic);
+
+/** @} TONE_GEN */
+
+/*****************************************************************************/
+/** @defgroup FSK_CONTROL FSK/Caller ID generation
+ * This group of functions is related to FSK generation, typically used with Caller ID/Call Waiting
+ * functionality. To set the frequencies, the data rate, and the FSK FIFO depth, please use the configuration
+ * GUI FSK dialog box.
+ *
+ * Here's a simple example code fragment to send data via FSK:
+ *
+ * @note In a "real" application, you should not use ProSLIC_CheckCIDBuffer(), but instead
+ *       call ProSLIC_GetInterrupts() and check if the FSK interrrupt fired off since the 
+ *       ProSLIC_GetInterrupts() will also report on loop closure/ring trip in addition FSK buffer
+ *       interrupt and the two functions will conflict with each other.
+ *
+ * @code
+ *
+ * #define FIFO_DEPTH (7-FSKBUF_DEPTH) //When we report the buffer at FSK BUFFER DEPTH, we can send
+ *                                     //at most 1 less than the maximum since that byte maybe still
+ *                                     //be modulated. Therefore, we say we can send 7 bytes, not
+ *                                     //8 after the interrupt.
+ *
+ * //ASSUME: FSK Buffer depth interrupt has been enabled in the constants file earlier...
+ *
+ *  // This should be called every time since it is likely a tone was played
+ *  // earlier which reprograms the oscillators...
+ * if( ProSLIC_FSKSetup(myProSLICChan, PROSLIC_NORTH_AMERICA_FSK) == RC_NONE)
+ * {
+ *
+ *  // Enable the CID block, at this point no tones other than the FSK ones
+ *  // should be played out...
+ * 	ProSLIC_EnableCID(myProSLICChan);
+ *
+ *  // Pre-load the FSK FIFO buffer with at most 8 bytes.
+ * 	ProSLIC_SendCID(myProSLICChan,buf,MIN(bufsz,8));
+ *
+ *	bytes_left_to_send = bufsz - MIN(bufsz,8);
+ *
+ * 	while(bytes_left_to_send > 0)
+ * 	{
+ * 		if(bytes_left_to_send < FIFO_DEPTH)
+ * 		{
+ * 			bytes_to_send = bytes_left_to_send;
+ * 		}
+ * 		else
+ * 		{
+ * 			bytes_to_send = FIFO_DEPTH;
+ *		}
+ *
+ * 		if( ProSLIC_SendCID(myProSLICChan,buf,bytes_to_send) != RC_NONE)
+ * 		{
+ * 			ProSLIC_DisableCID(myProSLICChan);
+ * 			return MY_FSK_ERROR;
+ * 		}
+ *
+ *		bytes_left_to_send -= bytes_to_send;
+ *
+ *		if(bytes_left_to_send)
+ *		{
+ *			do
+ *			{
+ *			  // See note above about this function...
+ *				ProSLIC_CheckCIDBuffer(myProSLICChan, &is_fifo_empty);
+ *
+ *			} while( is_fifo_empty != 1 );
+ *		}
+ *
+ * 	};
+ *
+ * 	ProSLIC_DisableCID(myProSLICChan);
+ * @endcode
+ *
+ * @note The above code fragment is sub-optimal since it does constantly poll the CID buffer
+ * state - one may want to implement the actual code using interrupts.
+ *
+ * @note The ProSLIC API demo does have a working example for Type 1 CID MDMF format.
+ *
+ * @{
+ */
+
+/**
+ * @brief
+ *  Configures the FSK generator from a configuration generated by the config tool.
+ *
+ * @warning If @ref ProSLIC_ToneGenSetup was called earlier, this function will need to be called again.
+ *
+ * @param[in] hProslic - which channel to configure
+ * @param[in] preset - which FSK configuration to use.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @note This function can be compiled out by defining DISABLE_FSK_SETUP
+ */
+
+int ProSLIC_FSKSetup (proslicChanType_ptr hProslic,int preset);
+
+/**
+ * @brief
+ *  Configures the FSK generator from a configuration generated by the config tool.
+ *
+ * @warning If @ref ProSLIC_ToneGenSetup was called earlier, this function will need to be called again.
+ *
+ * @param[in] pProslic - which channel to configure
+ * @param[in] cfg - which FSK configuration to use.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @note This function can be compiled out by defining DISABLE_FSK_SETUP
+ */
+
+int ProSLIC_FSKSetupPtr (proslicChanType_ptr pProslic, ProSLIC_FSK_Cfg *cfg);
+
+/**
+ * @brief
+ *  This function enables FSK mode and clears the FSK FIFO.  It is assumed that PCM has been enabled and that @ref ProSLIC_FSKSetup
+ *  has been called at some point.
+ *
+ * @warning If @ref ProSLIC_ToneGenSetup was called earlier, @ref ProSLIC_FSKSetup will need to be called again.
+ *
+ * @param[in] hProslic - which channel to check upon.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ */
+
+int ProSLIC_EnableCID (proslicChanType_ptr hProslic);
+
+/**
+ * @brief
+ *  This function disables FSK mode.
+ *
+ * @param[in] hProslic - which channel to disable FSK mode.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ */
+
+int ProSLIC_DisableCID (proslicChanType_ptr hProslic);
+
+/**
+ * @brief
+ *  Check if the FSK FIFO is empty or not.  This should only be called after ProSLIC_SendCID.
+ *
+ * @param[in] hProslic - which channel to check upon.
+ * @param[out] fsk_buf_avail - is the buffer available? 1 = Yes, 0  = No.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @note - This modifies the IRQ1 register contents, so some other interrupts may be lost. An alternative is to enable the
+ *         FSK FIFO interrupt and trigger off of it when it does occur in your interrupt service routine and call ProSLIC_GetInterrupts() to decode the interrupts present.
+ */
+
+int ProSLIC_CheckCIDBuffer (proslicChanType_ptr hProslic, uInt8 *fsk_buf_avail);
+
+/**
+ * @brief
+ *  Send numBytes as FSK encoded data.  It is assumed that numBytes <= FIFO Depth (typically 8) and that the FIFO
+ *  is free. It is also assumed that @ref ProSLIC_PCMStart has been called and that we're in
+ *  @ref LF_FWD_OHT or @ref LF_REV_OHT mode for Type-1 or  @ref LF_REV_ACTIVE or @ref LF_FWD_ACTIVE
+ *  if we're in Type-2 caller ID.
+ *
+ * @param[in] hProslic - which channel to send the data through.
+ * @param[in] buffer - byte array of data to send.
+ * @param[in] numBytes - number of bytes to send. MUST be less than or equal to the FIFO size
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @sa ProSLIC_CheckCIDBuffer ProSLIC_FSKSetup ProSLIC_EnableCID ProSLIC_DisableCID
+ */
+
+int ProSLIC_SendCID (proslicChanType_ptr hProslic, uInt8 *buffer,
+                     uInt8 numBytes);
+
+/**
+ * @brief Control if the start/stop bits are enabled.
+ *
+ * @param[in] hProslic - which channel to adjust
+ * @param[in] enable_startStop - TRUE - start/stop bits are enabled, FALSE - disabled
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @note: This does not replace @ref ProSLIC_FSKSetup, but is a supplement that toggles
+ * one of the registers that the preset modifies.  It is assumed that @ref ProSLIC_FSKSetup
+ * was called at some point earlier in the code flow.
+ */
+
+int ProSLIC_ModifyCIDStartBits(proslicChanType_ptr hProslic,
+                               uInt8 enable_startStop);
+
+
+/** @} FSK_CONTROL */
+
+/*****************************************************************************/
+/** @defgroup AUDIO_CONTROL Audio control/configuration
+ * @{
+ */
+/** @defgroup PCM_CONTROL PCM control
+ * This group of functions is used to configure and control the PCM bus.  It is essential that @ref ProSLIC_PCMSetup,
+ * @ref ProSLIC_PCMTimeSlotSetup and @ref ProSLIC_PCMStart are called prior to any tone or FSK generation.
+ *
+ * See @ref PROSLIC_AUDIO code fragment on how the functions relate during initialization.
+ *
+ * @{
+ */
+
+/**
+ * @brief
+ *  This configures the PCM bus with parameters such as companding and data latching timing.
+ *
+ * @param[in] hProslic - which channel should be configured
+ * @param[in] preset - which preset to use from the constants file (see configuration tool, PCM dialog box)
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @sa ProSLIC_PCMTimeSlotSetup ProSLIC_PCMStart
+ */
+
+int ProSLIC_PCMSetup (proslicChanType_ptr hProslic,int preset);
+
+/**
+ * @brief
+ *  This configures the ProSLIC to latch and send the PCM data at a particular timeslot in terms of PCM clocks (PCLK).
+ *
+ *  Typically, for aLaw and uLaw, one can use the following calculation to set the rxcount and txcount parameters:
+ *
+ *  rxcount = txcount = (channel_number)*8;
+ *
+ *  For 16 bit linear, one can do the following:
+ *
+ *  rxcount = txcount = (channel_number)*16;
+ *
+ * where channel_number = which ProSLIC channel on the PCM bus.  For example, if one were to have 2 dual channel
+ * ProSLIC's on the same PCM bus, this value would range from 0 to 3.
+ *
+ * @param[in] hProslic - which channel should be configured
+ * @param[in] rxcount -  how many clocks until reading data from the PCM bus
+ * @param[in] txcount -  how many clocks until writing data to the PCM bus.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @sa ProSLIC_PCMSetup ProSLIC_PCMStart
+ */
+
+int ProSLIC_PCMTimeSlotSetup (proslicChanType_ptr hProslic, uInt16 rxcount,
+                              uInt16 txcount);
+
+/**
+ * @brief
+ *  This enables PCM transfer on the given ProSLIC channel.
+ *
+ * @param[in] hProslic - - which channel should be enabled
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @sa ProSLIC_PCMSetup ProSLIC_PCMTimeSlotSetup ProSLIC_PCMStop
+ */
+
+int ProSLIC_PCMStart (proslicChanType_ptr hProslic);
+
+/**
+ * @brief
+ *  This disables PCM transfer on the given ProSLIC channel. Typically, this is called for debugging
+ *  purposes only.
+ *
+ * @param[in] hProslic - - which channel should be disabled
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @sa ProSLIC_PCMSetup ProSLIC_PCMTimeSlotSetup ProSLIC_PCMStart
+ */
+
+int ProSLIC_PCMStop (proslicChanType_ptr hProslic);
+
+/**
+ * @brief
+ * Program desired loopback test mode for the given channel.
+ *
+ * @param[in] hProslic -  which channel should be modified
+ * @param[in] newMode - what is the desired loopback mode.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ */
+
+int ProSLIC_SetLoopbackMode (proslicChanType_ptr hProslic,
+                             ProslicLoopbackModes newMode);
+
+/**
+ * @brief
+ * Program desired mute test mode for the given channel.
+ *
+ * @param[in] hProslic - which channel should be modified
+ * @param[in] muteEn - what is the desired mode.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ */
+
+int ProSLIC_SetMuteStatus (proslicChanType_ptr hProslic,
+                           ProslicMuteModes muteEn);
+
+/** @} PCM_CONTROL */
+
+/*****************************************************************************/
+/** @defgroup GAIN_CONTROL Gain control
+ * @{
+ */
+
+/**
+ * @brief
+ *  Sets the TX audio gain (toward the network). This funcion DOES NOT actually calculate the values for the preset.
+ *  To dynamically calculate the values, you would need to call @ref ProSLIC_dbgSetTXGain .
+ *
+ * @param[in] hProslic - which channel to configure
+ * @param[in] preset - which preset to use (this may be from the constants file)
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @note One can use this in conjunction with @ref ProSLIC_dbgSetTXGain to dynamically
+ * change the audio gain. It is important to have the presets of both routines match.
+ *
+ * The following code * fragment will set the TX audio gain to -5 dB:
+ *
+ * @code
+ * ProSLIC_dbgSetTXGain(myChannel, -5, MY_IMPEDENCE,0);
+ * ProSLIC_TXAudioGainSetup(myChannel,0);
+ * @endcode
+ *
+ * @sa ProSLIC_RXAudioGainSetup ProSLIC_dbgSetTXGain ProSLIC_AudioGainSetup
+ */
+
+int ProSLIC_TXAudioGainSetup (proslicChanType_ptr hProslic,int preset);
+
+/**
+ * @brief
+ *  Adjusts gain of TX audio path by scaling the PGA and Equalizer coefficients by the supplied values.
+ *
+ * @param[in] hProslic   - which channel to configure
+ * @param[in] preset     - which preset to use (this may be from the constants file)
+ * @param[in] pga_scale  - scale factor which pga coefficients are to be multiplied
+ * @param[in] eq_scale   - scale factor which equalizer coefficients are to be multiplied
+ * @retval int           - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @note This function can be used in lieu of @ref ProSLIC_dbgSetTXGain to dynamically
+ * change the audio gain when gain steps of 0.1dB do not suffice, or if an attenuation
+ * > 30dB is required.
+ *
+ * The following code * fragment will scale the TX audio gain by a factor of (0.707)*(0.500)
+ *
+ * @code
+ * uInt32  pga_gain_scale = 707;
+ * uInt32  eq_gain_scale  = 500;
+ * ProSLIC_TXAudioGainScale(pProslic,DEFAULT_PRESET,pga_gain_scale,eq_gain_scale);
+ * @endcode
+ *
+ * @sa ProSLIC_RXAudioGainScale
+ */
+int ProSLIC_TXAudioGainScale (proslicChanType_ptr hProslic,int preset,
+                              uInt32 pga_scale,uInt32 eq_scale);
+
+/**
+ * @brief
+ *  Configures the RX audio gain (toward the telephone). This function DOES NOT actually calculate the values for the preset.
+ *  To dynamically calculate the values, you would need to call @ref ProSLIC_dbgSetRXGain .
+ *
+ * @param[in] hProslic - which channel to configure
+ * @param[in] preset - which preset to use (this may be from the constants file)
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @note One can use this in conjunction with @ref ProSLIC_dbgSetRXGain to dynamically
+ * change the audio gain. It is important to have the presets of both routines match.
+ *
+ * The following code * fragment will set the RX audio gain to -1 dB:
+ *
+ * @code
+ * ProSLIC_dbgSetRXGain(myChannel, -1, MY_IMPEDENCE,0);
+ * ProSLIC_RXAudioGainSetup(myChannel,0);
+ * @endcode
+ *
+ * @sa ProSLIC_TXAudioGainSetup ProSLIC_dbgSetRXGain ProSLIC_AudioGainSetup
+ */
+
+int ProSLIC_RXAudioGainSetup (proslicChanType_ptr hProslic,int preset);
+
+/**
+ * @brief
+ *  Adjusts gain of RX audio path by scaling the PGA and Equalizer coefficients by the supplied values.
+ *
+ * @param[in] hProslic   - which channel to configure
+ * @param[in] preset     - which preset to use (this may be from the constants file)
+ * @param[in] pga_scale  - scale factor which pga coefficients are to be multiplied
+ * @param[in] eq_scale   - scale factor which equalizer coefficients are to be multiplied
+ * @retval int           - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @note This function can be used in lieu of @ref ProSLIC_dbgSetRXGain to dynamically
+ * change the audio gain when gain steps of 0.1dB do not suffice, or if an attenuation
+ * > 30dB is required.
+ *
+ * The following code * fragment will scale the TX audio gain by a factor of (0.707)*(0.500)
+ *
+ * @code
+ * uInt32  pga_gain_scale = 707;
+ * uInt32  eq_gain_scale  = 500;
+ * ProSLIC_RXAudioGainScale(pProslic,DEFAULT_PRESET,pga_gain_scale,eq_gain_scale);
+ * @endcode
+ *
+ * @sa ProSLIC_TXAudioGainScale
+ */
+int ProSLIC_RXAudioGainScale (proslicChanType_ptr hProslic,int preset,
+                              uInt32 pga_scale,uInt32 eq_scale);
+
+/**
+ * @brief
+ *  Configures and sets the audio gains - for both RX (toward the phone) and the TX (toward the network). Unlike
+ *  the @ref ProSLIC_RXAudioGainSetup and @ref ProSLIC_TXAudioGainSetup this does both the calculations and then
+ *  configures the given channel in one step.  It is assumed that the preset gain array is at least 2 elements in size.
+ *
+ * @param[in] hProslic - which channel to configure
+ * @param[in] rxgain - what is the gain/loss of the RX transmit path in 1 dB units (negative = attenuation)
+ * @param[in] txgain - what is the gain/loss of the TX transmit path in 1 dB units (negative = attenuation)
+ * @param[in] preset - what is the impedance preset value
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * The following code * fragment will set the RX audio gain to -1 dB snd TX audio gain to -5 dB:
+ *
+ * @code
+ * ProSLIC_AudioGain(myChannel, -1, -5,  MY_IMPEDENCE);
+ * @endcode
+ *
+ * @sa ProSLIC_TXAudioGainSetup ProSLIC_dbgSetRXGain ProSLIC_dbgSetRXGain ProSLIC_dbgSetTXGain
+ */
+
+int ProSLIC_AudioGainSetup (proslicChanType_ptr hProslic,int32 rxgain,
+                            int32 txgain,int preset);
+
+/**
+ * @brief
+ *  This function calculates the preset values for the RX audio (toward the telephone) - it does NOT set the
+ *  actual register values.  For that, please use @ref ProSLIC_RXAudioGainSetup .
+ *
+ * @param[in] pProslic - which channel to configure
+ * @param[in] gain - gain to set the preset values to.
+ * @param[in] impedance_preset - impedence preset in the constants file.
+ * @param[in] audio_gain_preset - index to the audio gain preset to store the value.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @sa ProSLIC_RXAudioGainSetup ProSLIC_AudioGainSetup ProSLIC_dbgSetTXGain
+ */
+
+int ProSLIC_dbgSetRXGain (proslicChanType *pProslic, int32 gain,
+                          int impedance_preset, int audio_gain_preset);
+
+/**
+ * @brief
+ *  This function calculates the preset values for the TX audio (toward the network) - it does NOT set the
+ *  actual register values.  For that, please use @ref ProSLIC_TXAudioGainSetup .
+ *
+ * @param[in] pProslic - which channel to configure
+ * @param[in] gain - gain to set the preset values to.
+ * @param[in] impedance_preset - impedance preset in the constants file.
+ * @param[in] audio_gain_preset - index to the audio gain preset to store the value.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @sa ProSLIC_TXAudioGainSetup ProSLIC_AudioGainSetup ProSLIC_dbgSetRXGain
+ */
+
+int ProSLIC_dbgSetTXGain (proslicChanType *pProslic, int32 gain,
+                          int impedance_preset, int audio_gain_preset);
+
+/** @} GAIN_CONTROL */
+/** @} AUDIO_CONTROL */
+/** @} PROSLIC_AUDIO */
+
+/*****************************************************************************/
+/** @defgroup HC_DETECT Hook Change detection
+ *
+ * This function group has routines used to implement a pulse dial, hook flash
+ * and general hook change detection. The outline of how to use these
+ * functions is as follows:
+ *
+ * - Initialize the data structure w/ @ref ProSLIC_InitializeHookChangeDetect
+ * - When hook change is detected or if there has been no activity for a minimum
+ *   of the interdigit time, call @ref ProSLIC_HookChangeDetect. Keep on calling
+ *   the function until we have a return code not equal to SI_HC_NEED_MORE_POLLS.
+ *   Again, the function should be called, when no hook activity is detected at
+ *   minimum of the interdigit time.
+ *
+ *   General theory (pulse digit):
+ *
+ *   ---|___|-----|__|---------
+ *
+ *   A    B    C    B   D
+ *
+ *   A - Offhook (time unknown)
+ *   B - Onhook (break time)
+ *   C - Offhook (make time)
+ *   D - Interdigit delay
+ *
+ *   We report after D occurs a pulse digit as long as the duration for B
+ *   is met.
+ *
+ *   For hook flash, we are looking at
+ *
+ *   ----|________________|-----------
+ *
+ *
+ *  Here we're looking for the pulse width meets a certain min/max time.  If the
+ *  time is exceeded, then we have likely a onhook or offhook event.
+ *
+ *   @note This set of functions require that the elapsed timer functions
+ *   documented in @ref PROSLIC_CUSTOMER_TIMER are implemented.
+ *
+ * @{
+ */
+
+/**
+ * @brief
+ *  Initialize pulse dial/hook detection parameters.
+ *
+ * @param[in,out] pPulse - the structure that is to be initialized.  Refer to your target market's pulse dial standard for exact values.
+ * @param[in] hookTime - a timer object suitable to be passed to a function of type @ref system_timeElapsed_fptr
+ *
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int ProSLIC_InitializeHookChangeDetect(hookChangeType *pPulse,void *hookTime);
+
+/**
+ * @brief
+ *  Implements pulse dial detection and should be called at every hook transition and after the minimum interdigit delay time (should continue calling until
+ *  the function returns back with a value other than SI_HC_NEED_MORE_POLLS.
+ *
+ * @param[in] pProslic - which channel had a hook transition.
+ * @param[in] pPulsedialCfg - what is the criteria to determine on/off hook states.
+ * @param[in,out] pPulseDialData - contians the timer information that was set in
+ * @ref ProSLIC_InitializeHookChangeDetect as well as the pulse digit detected
+ *
+ * @retval int - either SI_HC_xxx values or a value between 1-10 for the number of pulses detected.  In most cases, a 0 is 10 pulses.  Please refer to
+ * your country's pulse dial standard for exact encoding.
+ */
+
+uInt8 ProSLIC_HookChangeDetect (proslicChanType *pProslic,
+                                hookChange_Cfg *pPulsedialCfg, hookChangeType *pPulseDialData);
+
+/** @} HC_DETECT */
+
+/*****************************************************************************/
+/**  @addtogroup PROSLIC_AUDIO
+ * @{
+ * @defgroup PROSLIC_DTMF_DECODE DTMF Decode
+ * This section covers DTMF decoding.
+ *
+ * @note Not all chipsets support this capability.  Please review your chipset
+ * documentation to confirm this capability is supported.
+ * @{
+ */
+
+/**
+ * @brief
+ *  Read/Decode DTMF digits.  The "raw" hexcode is returned in this function and would require
+ *  further processing.  For example, on the Si3217x chipset, the following mapping exists:
+ *
+ * DTMF Digit | API output value
+ * :-|:---
+ * 0 | 0xA
+ * 1 | 1
+ * 2 | 2
+ * 3 | 3
+ * 4 | 4
+ * 5 | 5
+ * 6 | 6
+ * 7 | 7
+ * 8 | 8
+ * 9 | 9
+ * A | 0xD
+ * B | 0xE
+ * C | 0xF
+ * D | 0
+ * \*| 0xB
+ * \# |0xC
+ *
+ * @note This function is only valid after @ref IRQ_DTMF occurred and should be called shortly
+ * thereafter.
+ *
+ * @warning Not all ProSLIC chipsets have a DTMF decoder.  Please review your chipset to make
+ * sure this capability exists.
+ *
+ * @param[in] hProslic - which channel is to be decoded.
+ * @param[out] pDigit - "raw" DTMF value (see comments in description)
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ *
+ */
+
+int ProSLIC_DTMFReadDigit (proslicChanType_ptr hProslic,uInt8 *pDigit);
+
+/** @} PROSLIC_DTMF_DECODE */
+/** @} PROSLIC_AUDIO */
+
+/*****************************************************************************/
+/** @defgroup PROSLIC_POWER_CONVERTER Power Converter control
+ * @{
+ */
+/**
+* @brief
+* Powers all DC/DC converters sequentially with delay to minimize peak power draw on VDC.
+* @param[in] hProslic - which channel to change state.
+* @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+*
+* @sa ProSLIC_PowerDownConverter
+*
+*/
+
+int ProSLIC_PowerUpConverter(proslicChanType_ptr hProslic);
+
+/**
+* @brief
+*  Safely power down dcdc converter after ensuring linefeed
+*  is in the open state.  Test power down by setting error
+*  flag if detected voltage does no fall below 5v.
+*
+* @param[in] hProslic - which channel to change state.
+* @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+*
+* @sa ProSLIC_PowerUpConverter
+*
+*/
+
+int ProSLIC_PowerDownConverter(proslicChanType_ptr hProslic);
+
+/**
+* @brief
+*  Set channel flag to indicate that the polarity of the
+*  DC-DC converter drive signal is to be inverted from what
+*  is indicated in the General Parameters. This inversion is
+*  relative to the polarity established by the General Parameters,
+*  not an absolute polarity.
+*
+*
+* @param[in] hProslic - which channel to change state.
+* @param[in] flag - inversion flag (1 - inverted, 0 - no inversion)
+* @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+*
+* @sa ProSLIC_PowerUpConverter
+*
+*/
+int ProSLIC_SetDCDCInversionFlag(proslicChanType_ptr hProslic, uInt8 flag);
+
+
+/** @} PROSLIC_POWER_CONVERTER */
+/*****************************************************************************/
+/** @defgroup PROSLIC_LB_CALIBRATION LB Calibration
+ * @{
+ */
+
+/**
+ * @brief
+ *  Run canned longitudinal balance calibration.
+ *
+ * @param[in] pProslic - start channel to start from for calibration.
+ * @param[in] size - number of channels to calibrate
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @note
+ * Use the @ref ProSLIC_Init function to perform all calibrations except Longitudinal Balance (LB).
+ * Use the @ref ProSLIC_LBCal function to perform LB calibration. LB Calibration typically needs
+ * to execute LB calibration once per system setup without a load connected.  The LB calibration
+ * results can be stored in non-volatile storage (flash, eeprom) and retrieved during your normal
+ * ProSLIC initialization.
+ *
+*  @sa ProSLIC_GetLBCalResult ProSLIC_LoadPreviousLBCal ProSLIC_LoadPreviousLBCalPacked ProSLIC_GetLBCalResultPacked
+ */
+
+int ProSLIC_LBCal (proslicChanType_ptr *pProslic, int size);
+
+/**
+ * @brief
+ *  This function returns the coefficient results of the last LB calibration.
+ *
+ * @param[in] pProslic - which channel to retrieve the values from.
+ * @param[out] result1 - results read from the last calibration
+ * @param[out] result2 - results read from the last calibration
+ * @param[out] result3 - results read from the last calibration
+ * @param[out] result4 - results read from the last calibration
+*  @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+*
+*  @sa ProSLIC_LBCal ProSLIC_LoadPreviousLBCal ProSLIC_LoadPreviousLBCalPacked ProSLIC_LBCal ProSLIC_GetLBCalResultPacked
+*/
+
+int ProSLIC_GetLBCalResult (proslicChanType *pProslic,int32 *result1,
+                            int32 *result2,int32 *result3,int32 *result4);
+
+/**
+ * @brief
+ *  This function loads previously stored LB calibration results to the appropriate ProSLIC
+ *  RAM locations.
+ *
+ * @param[in] pProslic - which channel to program the values
+ * @param[in] result1 - values to be written
+ * @param[in] result2 - values to be written
+ * @param[in] result3 - values to be written
+ * @param[in] result4 - values to be written
+*  @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+*
+*  @sa ProSLIC_LBCal ProSLIC_LoadPreviousLBCalPacked ProSLIC_LBCal ProSLIC_GetLBCalResult ProSLIC_GetLBCalResultPacked
+*/
+
+int ProSLIC_LoadPreviousLBCal (proslicChanType *pProslic,int32 result1,
+                               int32 result2,int32 result3,int32 result4);
+
+/**
+ * @brief
+ *  This function returns the results of the last LB calibration packed into single int32.
+ *
+ * @param[in] pProslic - which channel to retrieve the values from.
+ * @param[out] result - results - where to store the value
+*  @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+*
+*  @sa ProSLIC_LBCal ProSLIC_LoadPreviousLBCal ProSLIC_LoadPreviousLBCalPacked ProSLIC_LBCal
+*/
+
+int ProSLIC_GetLBCalResultPacked (proslicChanType *pProslic,int32 *result);
+
+/**
+ * @brief
+ *  This function loads previously stored LB calibration results that are in the packed format.
+ *
+ * @param[in] pProslic - which channel to retrieve the values from.
+ * @param[in] result - results read from @ref ProSLIC_GetLBCalResultPacked
+*  @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+*
+*  @sa ProSLIC_LBCal ProSLIC_LoadPreviousLBCal ProSLIC_LBCal ProSLIC_GetLBCalResultPacked
+*
+*/
+
+int ProSLIC_LoadPreviousLBCalPacked (proslicChanType *pProslic,int32 *result);
+
+/** @} PROSLIC_LB_CALIBRATION */
+
+
+/*****************************************************************************/
+/** @addtogroup DIAGNOSTICS
+ * @{
+ */
+
+/**
+ * @brief
+ *  This function can be used to verify that the SPI interface is functioning
+ *  properly by performing a series of read back tests.  This test DOES modify
+ *  certain registers, so a reinitialization will be required.  This test is
+ *  recommended only for development use.
+ *
+ * @param[in] pProslic - This should point to the channel that is to be verified.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error amd will typically return back
+ * @ref RC_SPI_FAIL if a SPI failure occured.
+ */
+
+int ProSLIC_VerifyControlInterface (proslicChanType_ptr pProslic);
+
+/** @addtogroup PSTN_CHECK PSTN Check
+ * @{
+ */
+
+/**
+ * @brief
+ * Allocates memory for a PSTN check object. One channel object is needed per
+ * ProSLIC channel.
+ *
+ *  @param[in,out] pstnCheckObj - pointer to the object that is to be initialized.
+ *  @param[in] num_objs - number of objects to allocate
+ *
+ *  @retval 0 = OK
+ */
+
+int ProSLIC_CreatePSTNCheckObjs(proslicPSTNCheckObjType_ptr *pstnCheckObj,
+                                unsigned int num_objs);
+#define ProSLIC_CreatePSTNCheckObj(PTRPTR) ProSLIC_CreatePSTNCheckObjs((PTRPTR), 1)
+
+/**
+ * @brief
+ * Allocates memory for a differential PSTN check object. One channel object is needed per
+ * ProSLIC channel.
+ *
+ *  @param[in,out] pstnCheckObj - pointer to the object that is to be initialized.
+ *  @param[in] num_objs - number of objects to allocate
+ *
+ *  @retval 0 = OK
+ */
+
+int ProSLIC_CreateDiffPSTNCheckObjs(proslicDiffPSTNCheckObjType_ptr
+                                    *pstnCheckObj, unsigned int num_objs);
+#define ProSLIC_CreateDiffPSTNCheckObj(PTRPTR) ProSLIC_CreateDiffPSTNCheckObjs((PTRPTR), 1)
+
+/**
+ * @brief
+ * Destroys a PSTN check object and deallocates memory.
+ *
+ * @param[in] pstnCheckObj - object to deallocate.
+ *
+ * @retval 0 = OK
+ */
+
+#define ProSLIC_DestroyPSTNCheckObj ProSLIC_DestroyPSTNCheckObjs
+int ProSLIC_DestroyPSTNCheckObjs(proslicPSTNCheckObjType_ptr *pstnCheckObj);
+
+/**
+ * @brief
+ *  Destroys a differential PSTN check object and deallocates memory.
+ *
+ * @param[in] pstnCheckObj - object to deallocate.
+ *
+ * @retval 0 = OK
+ */
+
+#define ProSLIC_DestroyDiffPSTNCheckObj ProSLIC_DestroyDiffPSTNCheckObjs
+int ProSLIC_DestroyDiffPSTNCheckObjs(proslicDiffPSTNCheckObjType_ptr
+                                     *pstnCheckObj);
+
+/**
+ * @brief
+ *  Initialize pstnCheckObj structure members
+ *
+ * @param[in] pstnCheckObj - which object to initialize
+ * @param[in] avgThresh - Average current threshold that indicates a PSTN is present (uA).
+ * @param[in] singleThresh - Single current threshold that indicates a PSTN is present (uA).
+ * @param[in] samples - number of samples to collect
+ * @retval 0 = OK
+ */
+
+int ProSLIC_InitPSTNCheckObj(proslicPSTNCheckObjType_ptr pstnCheckObj,
+                             int32 avgThresh, int32 singleThresh, uInt8 samples);
+
+/**
+ * @brief
+ *  This function initializes a differential PSTN detection object.
+ *
+ *  @param[in,out] pstnDiffCheckObj - object to be initialized
+ *  @param[in] preset1 - DC Feed preset to be used for first loop I/V measurement
+ *  @param[in] preset2 - DC Feed preset to be used for second loop I/V measurement
+ *  @param[in] entry_preset - restore_preset DC Feed preset that is restored after PSTN check is complete.
+ *  @param[in] femf_enable - Flag to enable OPEN state hazardous voltage measurement (0 = disabled, 1 = enabled)
+ *  @retval 0 = OK
+ */
+
+int ProSLIC_InitDiffPSTNCheckObj(proslicDiffPSTNCheckObjType_ptr
+                                 pstnDiffCheckObj, int preset1, int preset2, int entry_preset, int femf_enable);
+
+/**
+ * @brief
+ * This function monitors longitudinal current (average and single sample) to quickly identify
+ * the presence of a live PSTN line. Sufficient polling needs to occur in order to quickly determine
+ * if a PSTN line is preset or not.
+ *
+ *  @param[in] pProslic - which channel to run this test on.
+ *  @param[in] pPSTNCheck - the initialized data structure that contains the intermediate results of this test.
+ *  @retval 0 = no PSTN detected/thresholds have not been exceeded, 1 = PSTN detected, state machine reset.
+ *
+ *  @note
+ *   If wanting to restart the test, one will need to call @ref ProSLIC_InitPSTNCheckObj again. However, if the
+ *   number of samples exceeds the buffer then the function will "wrap".
+ */
+
+int ProSLIC_PSTNCheck(proslicChanType *pProslic,
+                      proslicPSTNCheckObjType *pPSTNCheck);
+
+/**
+ * @brief
+ *  This function monitors for a foreign voltage (if enabled) and measures the differential I/V
+ *  characteristics of the loop at 2 unique settings to detect a foreign PSTN.  It is assumed that polling will
+ *  occur at the configured value found in @ref PSTN_DET_POLL_RATE.
+ *
+ *  @param[in] pProslic - channel to be monitored
+ *  @param[in,out] pPSTNCheck - pointer to an initialized structure that is used by the function to
+ *  store state information.
+ *  @retval int @ref RC_NONE - test is in progress, @ref RC_COMPLETE_NO_ERR - test complete, no errors, @ref RC_PSTN_OPEN_FEMF - detected foreign voltage, RC_CHANNEL_TYPE_ERR = a non-ProSLIC device was called to perform this function
+ */
+int ProSLIC_DiffPSTNCheck(proslicChanType *pProslic,
+                          proslicDiffPSTNCheckObjType *pPSTNCheck);
+
+/** @} PSTN_CHECK */
+/** @} DIAGNOSTICS*/
+
+/*****************************************************************************/
+/** @defgroup PROSLIC_DCFEED DC Feed Setup and control
+ * @{
+ */
+
+/**
+ * @brief
+ *  Configures the DC feed from a preset.
+ *
+ * @param[in] hProslic - which channel to configure
+ * @param[in] preset - the preset to use
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @note This function can be disabled by @ref DISABLE_DCFEED_SETUP
+ */
+
+int ProSLIC_DCFeedSetup (proslicChanType_ptr hProslic,int preset);
+
+/**
+ * @brief
+ *  Configures the DC feed from a preset.
+ *
+ * @param[in] hProslic - which channel to configure
+ * @param[in] cfg - pointer to preset storage structure
+ * @param[in] preset - the preset to use
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @note This function can be disabled by @ref DISABLE_DCFEED_SETUP
+ */
+int ProSLIC_DCFeedSetupCfg (proslicChanType_ptr hProslic,
+                            ProSLIC_DCfeed_Cfg *cfg, int preset);
+
+/**
+ * @brief
+ *  This function allows one to adjust the DC open circuit voltage level dynamically. Boundary checking is done.
+ *
+ * @note This function does NOT modify the register sets needed, it calculates the correct values and stores
+ * them in the correct preset.  Use @ref ProSLIC_DCFeedSetup to program the device with the new values.
+ *
+ * @param[in] pProslic - which channel to configure
+ * @param[in] v_vlim_val - absolute voltage level
+ * @param[in] preset - DC Feed preset to be modified.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @sa ProSLIC_dbgSetDCFeedIloop ProSLIC_DCFeedSetup
+ */
+
+int ProSLIC_dbgSetDCFeedVopen (proslicChanType *pProslic, uInt32 v_vlim_val,
+                               int32 preset);
+
+/**
+ * @brief
+ *  This function allows one to adjust the loop current level dynamically. Boundary checking is done.
+ *
+ * @note This function does NOT modify the register sets needed, it calculates the correct values and stores
+ * them in the correct preset.  Use @ref ProSLIC_DCFeedSetup to program the device with the new values.
+ *
+ * @param[in] pProslic - which channel to configure
+ * @param[in] i_ilim_val - loop current level
+ * @param[in] preset - DC Feed preset to be modified.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @sa ProSLIC_dbgSetDCFeedVopen ProSLIC_DCFeedSetup
+ */
+
+int ProSLIC_dbgSetDCFeedIloop (proslicChanType *pProslic, uInt32 i_ilim_val,
+                               int32 preset);
+
+/**
+ * @brief
+ *  This function allows one to enable/disable power savings mode found on some of the chipsets.  This allows one
+ *  to change the default value set in the GUI config tool.
+ *
+ * @param[in] pProslic - which channel to configure
+ * @param[in] pwrsave -  power savings mode enabled or disabled - value expected: @ref PWRSAVE_DISABLE or @ref PWRSAVE_ENABLE
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ */
+
+int ProSLIC_SetPowersaveMode(proslicChanType *pProslic, int pwrsave);
+
+/** @} PROSLIC_DCFEED */
+
+/*****************************************************************************/
+/** @defgroup MESSAGE_WAITING Message Waiting Indicator routines
+ * @{
+ */
+
+/**
+ * @brief
+ *  Configure optional MWI voltage settings.  Default value is 95v.
+ *
+ * @details
+ *  Set MWI flashing voltage level (Vpk).
+ *
+ * @note
+ *  Proper patch must be loaded for this feature to work properly.  Code does not
+ *  automatically verify that this patch is loaded.
+ *
+ * @param[in] hProslic - channel to modify
+ * @param[in] vpk_mag - MWI voltage level (vpk) (no change is made if 0)
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+int ProSLIC_MWISetV (proslicChanType_ptr hProslic,uInt16 vpk_mag);
+
+/**
+ * @brief
+ *  Enables message waiting indicator feature
+ *
+ * @details
+ *  Message waiting (neon flashing) enabled if device is in the onhook state.
+ *  Otherwise, function will not execute and return RC_MWI_ENABLE_FAIL.  This
+ *  function must be called to ENABLE MWI prior to calling ProSLIC_MWI to toggle
+ *  the voltage level on TIP-RING.
+ *
+ * @note
+ *  Proper patch must be loaded for this feature to work properly.  Code does not
+ *  automatically verify that this patch is loaded.
+ *
+ * @param[in] hProslic - channel to modify
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+int ProSLIC_MWIEnable (proslicChanType_ptr hProslic);
+
+/**
+ * @brief
+ *  Disables message waiting indicator feature
+ *
+ * @details
+ *  Message waiting (neon flashing) disable.  Turns off flashing and disabled
+ *  MWI feature.
+ *
+ * @note
+ *  Proper patch must be loaded for this feature to work properly.  Code does not
+ *  automatically verify that this patch is loaded.
+ *
+ * @param[in] hProslic - channel to modify
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+int ProSLIC_MWIDisable (proslicChanType_ptr hProslic);
+
+/**
+ * @brief
+ *  Implements message waiting indicator
+ *
+ * @details
+ *  Message waiting (neon flashing) state toggling.  If MWI feature has not been
+ *  enabled by calling ProSLIC_SetMWIEnable(), then this function will return
+ *  RC_MWI_NOT_ENABLED
+ *
+ * @note
+ *  Proper patch must be loaded for this feature to work properly.  Code does not
+ *  automatically verify that this patch is loaded.
+ *
+ * @param[in] hProslic - channel to modify
+ * @param[in] flash_on - 0 = lamp off, 1 = lamp on.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int ProSLIC_SetMWIState(proslicChanType_ptr hProslic,uInt8 flash_on);
+
+/**
+ * @brief
+ *  Intializes message waiting indicator with ramp configurability
+ *
+ * @details
+ *  Message waiting (neon flashing) initialization.  If MWI feature has not been
+ *  enabled by calling ProSLIC_SetMWIEnable(), then this function will return
+ *  RC_MWI_NOT_ENABLED
+ *
+ * @note
+ *  Proper patch must be loaded for this feature to work properly.  Code does not
+ *  automatically verify that this patch is loaded.
+ *
+ * @param[in] pProslic - channel to modify
+ * @param[in] steps - number of steps in ramp, tick duration is time of one step
+ * @param[in] onTime - number of ticks MWI is in the ON state
+ * @param[in] offTime - number of ticks MWI is in the OFF state
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int ProSLIC_MWIRampStart(proslicChanType_ptr pProslic, uInt32 steps, uInt32 onTime, uInt32 offTime);
+
+/**
+ * @brief
+ *  Implements message waiting indicator with ramp between ON and OFF states
+ *
+ * @details
+ *  Message waiting (neon flashing) polling function.  If MWI feature has not been
+ *  enabled by calling ProSLIC_SetMWIEnable(), then this function will return
+ *  RC_MWI_NOT_ENABLED
+ *
+ * @note
+ *  Proper patch must be loaded for this feature to work properly.  Code does not
+ *  automatically verify that this patch is loaded.
+ *
+ * @param[in] pProslic - channel to modify
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+ 
+int ProSLIC_MWIRampPoll(proslicChanType_ptr pProslic);
+
+/**
+ * @brief
+ *  Restores ramping message waiting indicator state
+ *
+ * @details
+ *  Message waiting (neon flashing) stop function.  If MWI feature has not been
+ *  enabled by calling ProSLIC_SetMWIEnable(), then this function will return
+ *  RC_MWI_NOT_ENABLED
+ *
+ * @note
+ *  Proper patch must be loaded for this feature to work properly.  Code does not
+ *  automatically verify that this patch is loaded.
+ *
+ * @param[in] pProslic - channel to modify
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+ 
+int ProSLIC_MWIRampStop(proslicChanType_ptr pProslic);
+
+/**
+ * @brief
+ *  Read MWI output state
+ *
+ * @details
+ *  Message waiting (neon flashing) state read.  If MWI feature has not been
+ *  enabled by calling ProSLIC_SetMWIEnable(), then this function will return
+ *  RC_MWI_NOT_ENABLED
+ *
+ * @note
+ *  Proper patch must be loaded for this feature to work properly.  Code does not
+ *  automatically verify that this patch is loaded.
+ *
+ * @param[in] hProslic - channel to modify
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int ProSLIC_GetMWIState(proslicChanType_ptr hProslic);
+
+/** @} MESSAGE_WAITING */
+
+/*****************************************************************************/
+/** @defgroup MISC MISC. routines
+ * @{
+ */
+
+/**
+ * @brief
+ *  This function initiates PLL free run mode.
+ *
+ * @param[in] hProslic - which channel to modify
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int ProSLIC_PLLFreeRunStart (proslicChanType_ptr hProslic);
+
+/**
+ * @brief
+ *  This function terminates PLL free run mode.
+ *
+ * @param[in] hProslic - which channel to modify
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int ProSLIC_PLLFreeRunStop (proslicChanType_ptr hProslic);
+
+/**
+ * @brief
+ *  This function returns PLL free run status.
+ *
+ * @param[in] hProslic - which channel to report upon.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int ProSLIC_GetPLLFreeRunStatus (proslicChanType_ptr hProslic);
+
+/**
+ *
+ * @brief
+ * Sets the ProSLIC into User Access Mode (UAM) on parts that support this. This is mainly
+ * used internally within the API.
+ *
+ * @param[in] pProslic - which channel to modify
+ * @param[in] isEnabled - is the User Access Mode enabled (NOTE: once enabled, it can not be disabled)
+ * @param[in] isBcast   - is this a broadcast on the daisychain
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+int ProSLIC_SetUserMode(proslicChanType *pProslic,BOOLEAN isEnabled,
+                        BOOLEAN isBcast);
+
+/*
+** @brief
+** Checks for improper ring exit (this is used internally by the API) and
+** not all chipsets need to call this.
+**
+** @param[in] pProslic - which ProSLIC to check.
+** Returns:
+** RC_NONE                -  Reinit not required
+** RC_REINIT_REQUIRED     -  Corrupted state machine - reinit required
+**
+*/
+int ProSLIC_isReinitRequired(proslicChanType *pProslic);
+
+/** @} MISC */
+/** @} */
+
+/* Hopefully customer's code will never call this function... */
+int ProSLIC_UnsupportedFeatureNoArg(proslicChanType_ptr pProslic,
+                                    const char *function_name);
+
+/* Helper function used by PSTN routines */
+#ifdef PSTN_DET_ENABLE
+void ProSLIC_PSTN_delay_poll(proslicTestStateType *pState, uInt16 delay);
+#endif
+
+#if defined(SI3218X) || defined(SI3226X) || defined(SI3228X) || defined(SI3217X) || defined(SI3219X)
+int ProSLIC_Calibrate(proslicChanType_ptr *hProslic, int maxChan, uInt8 *calr,
+                      int maxTime);
+#endif
+/**
+ * @brief determine if the given channel is a ProSLIC or DAA
+ *
+ * @param[in,out] pProslic - channel to be probed.
+ * @retval PROSLIC | DAA | UNKNOWN
+ */
+int ProSLIC_identifyChannelType(proslicChanType *pProslic);
+
+/* The following functions are used as part of the chipset init functions, not meant to be called
+   outside this scope.
+*/
+int ProSLIC_ReInit_helper(proslicChanType_ptr *pProslic, int size,
+                          initOptionsType init_option, int numChanPerDevice);
+int ProSLIC_VerifyMasterStat(proslicChanType_ptr);
+
+void ProSLIC_LoadSupportRAM(proslicChanType *pProslic, uInt8 channel,
+                                   const uInt16 *address, const ramData *data);
+
+#endif /*end ifdef PROSLIC_H*/
+
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/inc/proslic_tstin.h b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/inc/proslic_tstin.h
new file mode 100644
index 0000000..0283473
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/inc/proslic_tstin.h
@@ -0,0 +1,437 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Author(s):
+ * cdp
+ *
+ * Distributed by:
+ * Silicon Laboratories, Inc
+ *
+ * This file contains proprietary information.
+ * No dissemination allowed without prior written permission from
+ * Silicon Laboratories, Inc.
+ *
+ * File Description:
+ * This is the header file for the inward test implementations.
+ *
+ */
+#ifndef PROSLIC_TSTIN_H
+#define PROSLIC_TSTIN_H
+
+#include "../config_inc/si_voice_datatypes.h"
+#include "proslic.h"
+
+/** @addtogroup DIAGNOSTICS
+ * @{
+ */
+/** @defgroup PROSLIC_TSTIN ProSLIC Inward Tests (Test-In)
+ * This section documents functions and data structures related to the
+ * ProSLIC/FXS inward test implementations.
+ * @{
+ */
+
+#define MIN_RINGING_SAMPLES 16          /**< Minimum number of ringing samples for measuring ring amplitude */
+#define MAX_RINGING_SAMPLES 255         /**< Maximum number of ringing samples for measuring ring amplitude */
+#define MIN_RINGING_SAMPLE_INTERVAL 1   /**< Minimum sample interval for measuring ring amplitude */
+#define MAX_RINGING_SAMPLE_INTERVAL 10  /**< Maximum sample interval for measuring ring amplitude */
+
+/**
+* Test-In results status
+*/
+enum
+{
+  TSTIN_RESULTS_INVALID,
+  TSTIN_RESULTS_VALID
+};
+
+/**
+* PCM format options
+*/
+enum
+{
+  PCM_8BIT,
+  PCM_16BIT
+};
+
+/**
+* Abort if Line-in-use option
+*/
+enum
+{
+  ABORT_LIU_DISABLED,
+  ABORT_LIU_ENABLED
+};
+
+/**
+* Check for loop closure option
+*/
+enum
+{
+  LCR_CHECK_DISABLED,
+  LCR_CHECK_ENABLED
+};
+
+/**
+* Check for ringtrip option
+*/
+enum
+{
+  RTP_CHECK_DISABLED,
+  RTP_CHECK_ENABLED
+};
+
+
+/**
+ * Defines generic test limit/value/status structure
+ */
+typedef struct
+{
+  int32			lowerLimit;     /**< Lower test limit */
+  int32			upperLimit;     /**< Upper test limit */
+  int32			value;          /**< Numeric test result */
+  uInt8			testResult;		/**< 0 - Fail, 1 - pass */
+} proslicTestObj;
+
+/**
+ * Defines structure for PCM Loopback Test
+ */
+typedef struct
+{
+  BOOLEAN			testEnable;		/**< Gate execution/updating of results with this flag */
+  BOOLEAN			pcmLpbkEnabled;	/**< Indicates if test data is valid (1) or stale (0) */
+  BOOLEAN			pcm8BitLinear;  /**< Set to use 8 bit linear mode (used if normally using ulaw or alaw) */
+  uInt8           pcmModeSave;    /**< Store entry PCMMODE value  */
+  uInt8			testResult;		/**< OR of all test results in this structure */
+} proslicPcmLpbkTest;
+
+
+/**
+ * Defines structure for DC Feed Test
+ */
+typedef struct
+{
+  BOOLEAN			testEnable;		    /**< Gate execution/updating of results with this flag */
+  BOOLEAN			testDataValid;	    /**< Indicates if test data is valid (1) or stale (0) */
+  BOOLEAN			abortIfLineInUse;   /**< Abort test if LCR set at the start of test. Leaves results invalid */
+  BOOLEAN			applyLcrThresh;     /**< Apply alternate LCR thresholds to ensure LCR event occurs */
+  uInt32
+  altLcrOffThresh;    /**< Optional LCROFFHK threshold to apply during test */
+  uInt32			altLcrOnThresh;     /**< Optional LCRONHK threshold to apply during test */
+  BOOLEAN			lcrStatus;		    /**< Indicates LCR status after applying test load */
+  proslicTestObj	dcfeedVtipOnhook;   /**< On-hook VTIP test results */
+  proslicTestObj	dcfeedVringOnhook;  /**< On-hook VRING test results */
+  proslicTestObj	dcfeedVloopOnhook;  /**< On-hook VLOOP test results */
+  proslicTestObj	dcfeedVbatOnhook;   /**< On-hook VBAT test results */
+  proslicTestObj	dcfeedItipOnhook;   /**< On-hook ITIP test results */
+  proslicTestObj	dcfeedIringOnhook;  /**< On-hook IRING test results */
+  proslicTestObj	dcfeedIloopOnhook;  /**< On-hook ILOOP test results */
+  proslicTestObj	dcfeedIlongOnhook;  /**< On-hook ILONG test results */
+  proslicTestObj	dcfeedVtipOffhook;  /**< Off-hook VTIP test results */
+  proslicTestObj	dcfeedVringOffhook; /**< Off-hook VRING test results */
+  proslicTestObj	dcfeedVloopOffhook; /**< Off-hook VLOOP test results */
+  proslicTestObj	dcfeedVbatOffhook;  /**< Off-hook VBAT test results */
+  proslicTestObj	dcfeedItipOffhook;  /**< Off-hook ITIP test results */
+  proslicTestObj	dcfeedIringOffhook; /**< Off-hook IRING test results */
+  proslicTestObj	dcfeedIloopOffhook; /**< Off-hook ILOOP test results */
+  proslicTestObj	dcfeedIlongOffhook; /**< Off-hook ILONG test results */
+  uInt8			testResult;		    /**< OR of all test results in this structure */
+} proslicDcFeedTest;
+
+
+/**
+ * Defines structure for Ringing Test
+ */
+typedef struct
+{
+  BOOLEAN			testEnable;		    /**< Gate execution/updating of results with this flag */
+  BOOLEAN			testDataValid;	    /**< Indicates if test data is valid (1) or stale (0) */
+  BOOLEAN			abortIfLineInUse;   /**< Abort test if LCR set at the start of test. Leaves results invalid */
+  uInt16			numSamples;         /**< Number of samples taken */
+  uInt8
+  sampleInterval;     /**< Sample interval (in ms - range 1 to 100) */
+  BOOLEAN			ringtripTestEnable; /**< Enable ringtrip test */
+  BOOLEAN			rtpStatus;          /**< RTP Bit */
+  proslicTestObj	ringingVac;         /**< Ringing AC Voltage test results */
+  proslicTestObj	ringingVdc;         /**< Ringing DC Voltage test results */
+  uInt8			testResult;		    /**< OR of all test results in this structure */
+} proslicRingingTest;
+
+/**
+ * Defines structure for Battery Test
+ */
+typedef struct
+{
+  BOOLEAN			testEnable;		/**< Gate execution/updating of results with this flag */
+  BOOLEAN			testDataValid;	/**< Indicates if test data is valid (1) or stale (0) */
+  proslicTestObj	vbat;           /**< VBAT test results */
+  uInt8			testResult;		/**< OR of all test results in this structure */
+} proslicBatteryTest;
+
+/**
+ * Defines structure for Audio Test
+ */
+typedef struct
+{
+  BOOLEAN			testEnable;		  /**< Gate execution/updating of results with this flag */
+  BOOLEAN			testDataValid;	  /**< Indicates if test data is valid (1) or stale (0) */
+  BOOLEAN			abortIfLineInUse; /**< Abort test if LCR set at the start of test. Leaves results invalid */
+  int32
+  zerodBm_mVpk;     /**< 0dBm voltage (in mVpk) of ref impedance */
+  proslicTestObj	txGain;		      /**< TX path gain test results */
+  proslicTestObj  rxGain;           /**< RX path gain test results */
+  uInt8			testResult;		  /**< OR of all test results in this structure */
+} proslicAudioTest;
+
+
+/**
+ * Defines structure for all tests
+ */
+typedef struct
+{
+  proslicPcmLpbkTest	pcmLpbkTest;
+  proslicDcFeedTest	dcFeedTest;
+  proslicRingingTest	ringingTest;
+  proslicBatteryTest	batteryTest;
+  proslicAudioTest	audioTest;
+} proslicTestInObjType;
+
+typedef proslicTestInObjType *proslicTestInObjType_ptr;
+
+
+/**
+ * @brief
+ *  Allocate memory and initialize the given structure.
+ *
+ * @param[in,out] *pTstin - the structure to initialize
+ * @param[in]     num_objs - number of Testin structures to allocate.
+ *
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ * @sa ProSLIC_DestroyTestInObjs
+ */
+int ProSLIC_createTestInObjs(proslicTestInObjType_ptr *pTstin, uInt32 num_objs);
+#define ProSLIC_createTestInObj(X) ProSLIC_createTestInObjs((X),1)
+
+/**
+ * @brief
+ *  Free memory reserved by the given structure.
+ *
+ * @param[in,out] *pTstin - the structure to initialize
+ *
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+int ProSLIC_destroyTestInObjs(proslicTestInObjType_ptr *pTstin);
+#define ProSLIC_destroyTestInObj ProSLIC_destroyTestInObjs
+
+/**
+ * @brief
+ *  Enable PCM loopback.
+ *
+ * @param[in]      pProslic  -  channel data structure
+ * @param[in,out]  pTstin - all control, limits, and results
+ *
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+int ProSLIC_testInPCMLpbkEnable(proslicChanType_ptr pProslic,
+                                proslicTestInObjType_ptr pTstin);
+
+
+/**
+ * @brief
+ *  Disable PCM loopback.
+ *
+ * @param[in]      pProslic  -  channel data structure
+ * @param[in,out]  pTstin - all control, limits, and results
+ *
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+int ProSLIC_testInPCMLpbkDisable(proslicChanType_ptr pProslic,
+                                 proslicTestInObjType_ptr pTstin);
+
+
+/**
+ * @brief
+ * DC Feed Test - the pTstin->dcFeedTest contains control, limits and test result information.
+ *
+ * @param[in]      pProslic  -  channel data structure
+ * @param[in,out]  pTstin - all control, limits, and results
+ *
+ * @retval int - error from @ref errorCodeType
+ * @retval RC_TEST_PASSED indicates test completed and passed
+ * @retval RC_TEST_FAILED indicates test completed and failed
+ * @retval RC_UNSUPPORTED_FEATURE indicates feature not supported on this device
+ * @retval RC_TEST_DISABLED indicates test has not been initialized/enabled
+ * @retval RC_LINE_IN_USE indicates LCS already set
+ *
+ */
+int ProSLIC_testInDCFeed(proslicChanType_ptr pProslic,
+                         proslicTestInObjType_ptr pTstin);
+
+
+/**
+ * @brief
+ * Ringing and Ringtrip Test
+ *
+ * @param[in]      pProslic  -  channel data structure
+ * @param[in,out]  pTstin - all control, limits, and results
+ *
+ * @retval int - error from @ref errorCodeType
+ * @retval RC_TEST_PASSED indicates test completed and passed
+ * @retval RC_TEST_FAILED indicates test completed and failed
+ * @retval RC_UNSUPPORTED_FEATURE indicates feature not supported on this device
+ * @retval RC_TEST_DISABLED indicates test has not been initialized/enabled
+ * @retval RC_LINE_IN_USE indicates LCS already set
+ *
+ */
+int ProSLIC_testInRinging(proslicChanType_ptr pProslic,
+                          proslicTestInObjType_ptr pTstin);
+
+/**
+ * @brief
+ * Battery Test -
+ * pTstin contains both the configuration data and test results.
+ * See **pTstin->batteryTest.testResult - Pass/Fail result
+ *
+ * @param[in]      pProslic  -  channel data structure
+ * @param[in,out]  pTstin - configuration and test results
+ *
+ * @retval int - error from @ref errorCodeType
+ * @retval RC_TEST_PASSED indicates test completed and passed
+ * @retval RC_TEST_FAILED indicates test completed and failed
+ * @retval RC_UNSUPPORTED_FEATURE indicates feature not supported on this device
+ * @retval RC_TEST_DISABLED indicates test has not been initialized/enabled
+ *
+ */
+int ProSLIC_testInBattery(proslicChanType_ptr pProslic,
+                          proslicTestInObjType_ptr pTstin);
+
+/**
+ * @brief
+ * Audio level inward test.  pTstin->audioTest contains all control, limits and results.
+ *
+ * @param[in]      pProslic  -  channel data structure
+ * @param[in,out]  pTstin - all control, limits, and results
+ *
+ * @retval int - error from @ref errorCodeType
+ * @retval RC_TEST_PASSED indicates test completed and passed
+ * @retval RC_TEST_FAILED indicates test completed and failed
+ * @retval RC_UNSUPPORTED_FEATURE indicates feature not supported on this device
+ * @retval RC_TEST_DISABLED indicates test has not been initialized/enabled
+ * @retval RC_LINE_IN_USE indicates LCS already set
+ *
+ */
+int ProSLIC_testInAudio(proslicChanType_ptr pProslic,
+                        proslicTestInObjType_ptr pTstin);
+
+/**
+ * @brief
+ *  Initialize/Enable PCM Loopback Test.  Links test config/limits
+ *  to inward test data structure.
+ *
+ * @param[in,out]  pTstin->pcmLpbkTest - all control, limits, and results
+ * @param[in]      pcmLpbkTest -  test config and limits to link to pTstin->pcmLpbkTest
+ *
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+int ProSLIC_testInPcmLpbkSetup(proslicTestInObjType *pTstin,
+                               proslicPcmLpbkTest *pcmLpbkTest);
+
+/**
+ * @brief
+ *  Initialize/Enable DC Feed Test.  Links test config/limits
+ *  to inward test data structure.
+ *
+ * @param[in,out]  pTstin->dcFeedTest - all control, limits, and results
+ * @param[in]      dcFeedTest -  test config and limits to link to pTstin->dcFeedTest
+ *
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+int ProSLIC_testInDcFeedSetup(proslicTestInObjType *pTstin,
+                              proslicDcFeedTest *dcFeedTest);
+
+/**
+ * @brief
+ *  Initialize/Enable Ringing Test.  Links test config/limits
+ *  to inward test data structure.
+ *
+ * @param[in,out]  pTstin->ringingTest - all control, limits, and results
+ * @param[in]      ringingTest -  test config and limits to link to pTstin->ringingTest
+ *
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+int ProSLIC_testInRingingSetup(proslicTestInObjType *pTstin,
+                               proslicRingingTest *ringingTest);
+
+/**
+ * @brief
+ *  Initialize/Enable Battery Test.  Links test config/limits
+ *  to inward test data structure.
+ *
+ * @param[in,out]  pTstin->batteryTest - all control, limits, and results
+ * @param[in]      batteryTest -  test config and limits to link to pTstin->batteryTest
+ *
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+int ProSLIC_testInBatterySetup(proslicTestInObjType *pTstin,
+                               proslicBatteryTest *batteryTest);
+
+/**
+ * @brief
+ *  Initialize/Enable Audio Test.  Links test config/limits
+ *  to inward test data structure.
+ *
+ * @param[in,out]  pTstin->audioTest - all control, limits, and results
+ * @param[in]      audioTest -  test config and limits to link to pTstin->audioTest
+ *
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+int ProSLIC_testInAudioSetup(proslicTestInObjType *pTstin,
+                             proslicAudioTest *audioTest);
+
+
+/**
+ * @brief
+ *  Debug utility to log presently loaded test limits
+ *
+ * @param[in]      pProslic  -  channel data structure
+ * @param[in]      pTstin - inward test data structure
+ *
+ * @retval int - error from @ref errorCodeType
+ * @retval RC_NONE indicates no error.
+ * @retval RC_UNSUPPORTED_FEATURE indicates feature not supported on this device
+ */
+int ProSLIC_testInPrintLimits(proslicChanType *pProslic,
+                              proslicTestInObjType *pTstin);
+
+/**
+ * @brief
+ *  Provide a simulated offhook using the ProSLIC test load.  You would call 
+ *  this function twice: once to enable the simulated test load 
+ *  (is_testStart = TRUE) and check if the upper layer correctly detected
+ *  the hook state change and possibly pass some audio.  After you have
+ *  completed this test/check, you would call the same function again to
+ *  restore the system to normal state (is_testStart = FALSE).
+ *
+ * @note This test can only be executed one at a time.  Running this on
+ *       multiple channels that have different DC Feed and digital control
+ *       settings will cause problems. If the all the channels have the
+ *       same settings, this restriction can be loosened.
+ *       
+ *
+ * @param[in]      pProslic  -  channel data structure
+ * @param[in]      is_testStart - is the the start or end of test.
+ * @param[in]      timeDelayMsec - how may mSec to delay prior to returning from
+                   the function.
+ *
+ * @retval int - error from @ref errorCodeType
+ * @retval RC_NONE indicates no error.
+ * @retval RC_UNSUPPORTED_FEATURE indicates feature not supported on this device
+ */
+
+int ProSLIC_testLoadTest(
+  SiVoiceChanType_ptr pProslic, 
+  BOOLEAN is_testStart, 
+  uint32_t timeDelayMsec);
+
+/** @} PROSLIC_TSTIN */
+/** @} DIAGNOSTICS */
+#endif
+
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/inc/si3218x.h b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/inc/si3218x.h
new file mode 100644
index 0000000..e2fd9d2
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/inc/si3218x.h
@@ -0,0 +1,305 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Distributed by:
+ * Silicon Laboratories, Inc
+ *
+ * This file contains proprietary information.
+ * No dissemination allowed without prior written permission from
+ * Silicon Laboratories, Inc.
+ *
+ */
+
+#ifndef SI3218XH_H
+#define SI3218XH_H
+
+#include "proslic.h"
+
+#define SI3218X_CHAN_PER_DEVICE             1
+
+
+/*
+** Calibration Constants
+*/
+
+#define SI3218X_CAL_STD_CALR1       0xC0
+#define SI3218X_CAL_STD_CALR2       0x18
+
+/* Timeouts in 10s of ms */
+#define SI3218X_TIMEOUT_DCDC_UP     200
+#define SI3218X_TIMEOUT_DCDC_DOWN   200
+
+
+/*
+** SI3218X DataTypes/Function Definitions
+*/
+
+
+typedef ProSLIC_DCfeed_Cfg Si3218x_DCfeed_Cfg;
+
+/*
+** Si3218x General Parameter Struct
+*/
+typedef struct
+{
+  /* Flags */
+  uInt8               device_key;
+  bomOptionsType      bom_option;
+  vdcRangeType        vdc_range;
+  autoZcalType        zcal_en;
+  pmBomType           pm_bom;
+  /* Raw Parameters */
+  ramData         i_oithresh_lo;
+  ramData         i_oithresh_hi;
+  ramData         v_ovthresh;
+  ramData         v_uvthresh;
+  ramData         v_uvhyst;
+  /* RAM Updates */
+  ramData         dcdc_fsw_vthlo;
+  ramData         dcdc_fsw_vhyst;
+  ramData         p_th_hvic;
+  ramData         coef_p_hvic;
+  ramData         bat_hyst;
+  ramData
+  vbath_expect;         /* default - this is overwritten by dc feed preset */
+  ramData
+  vbatr_expect;         /* default - this is overwritten by ring preset */
+  ramData         pwrsave_timer;
+  ramData         pwrsave_ofhk_thresh;
+  ramData         vbat_track_min;       /* Same as DCDC_VREF_MIN */
+  ramData         vbat_track_min_rng;   /* Same as DCDC_VREF_MIN_RNG */
+  ramData         dcdc_ana_scale;
+  ramData         therm_dbi;
+  ramData         vov_dcdc_slope;
+  ramData         vov_dcdc_os;
+  ramData         vov_ring_bat_dcdc;
+  ramData         vov_ring_bat_max;
+  ramData         dcdc_verr;
+  ramData         dcdc_verr_hyst;
+  ramData         pd_uvlo;
+  ramData         pd_ovlo;
+  ramData         pd_oclo;
+  ramData         pd_swdrv;
+  ramData         dcdc_uvpol;
+  ramData         dcdc_rngtype;
+  ramData         dcdc_ana_toff;
+  ramData         dcdc_ana_tonmin;
+  ramData         dcdc_ana_tonmax;
+  uInt8           irqen1;
+  uInt8           irqen2;
+  uInt8           irqen3;
+  uInt8           irqen4;
+  uInt8           enhance;
+  uInt8            auto_reg;
+} Si3218x_General_Cfg;
+
+/*
+** Defines structure for configuring pcm
+*/
+typedef struct
+{
+  uInt8 pcmFormat;
+  uInt8 widebandEn;
+  uInt8 pcm_tri;
+  uInt8 tx_edge;
+  uInt8 alaw_inv;
+} Si3218x_PCM_Cfg;
+
+/*
+** Defines structure for configuring pulse metering
+*/
+typedef struct
+{
+  ramData pm_amp_thresh;
+  uInt8 pmFreq;
+  uInt8 pmAuto;
+  ramData pmActive;
+  ramData pmInactive;
+} Si3218x_PulseMeter_Cfg;
+/*
+** Defines structure for configuring FSK generation
+*/
+typedef ProSLIC_FSK_Cfg Si3218x_FSK_Cfg;
+
+
+/*
+** Defines structure for configuring impedance synthesis
+*/
+typedef struct
+{
+  ramData zsynth_b0;
+  ramData zsynth_b1;
+  ramData zsynth_b2;
+  ramData zsynth_a1;
+  ramData zsynth_a2;
+  uInt8 ra;
+} Si3218x_Zsynth_Cfg;
+
+/*
+** Defines structure for configuring hybrid
+*/
+typedef struct
+{
+  ramData ecfir_c2;
+  ramData ecfir_c3;
+  ramData ecfir_c4;
+  ramData ecfir_c5;
+  ramData ecfir_c6;
+  ramData ecfir_c7;
+  ramData ecfir_c8;
+  ramData ecfir_c9;
+  ramData ecfir_b0;
+  ramData ecfir_b1;
+  ramData ecfir_a1;
+  ramData ecfir_a2;
+} Si3218x_hybrid_Cfg;
+
+/*
+** Defines structure for configuring GCI CI bits
+*/
+typedef struct
+{
+  uInt8 gci_ci;
+} Si3218x_CI_Cfg;
+
+/*
+** Defines structure for configuring audio eq
+*/
+
+typedef struct
+{
+  ramData txaceq_c0;
+  ramData txaceq_c1;
+  ramData txaceq_c2;
+  ramData txaceq_c3;
+
+  ramData rxaceq_c0;
+  ramData rxaceq_c1;
+  ramData rxaceq_c2;
+  ramData rxaceq_c3;
+} Si3218x_audioEQ_Cfg;
+
+/*
+** Defines structure for configuring audio gain
+*/
+typedef ProSLIC_audioGain_Cfg Si3218x_audioGain_Cfg;
+
+
+
+typedef struct
+{
+  Si3218x_audioEQ_Cfg audioEQ;
+  Si3218x_hybrid_Cfg hybrid;
+  Si3218x_Zsynth_Cfg zsynth;
+  ramData txgain;
+  ramData rxgain;
+  ramData rxachpf_b0_1;
+  ramData  rxachpf_b1_1;
+  ramData  rxachpf_a1_1;
+  int16 txgain_db; /*overall gain associated with this configuration*/
+  int16 rxgain_db;
+} Si3218x_Impedance_Cfg;
+
+
+
+/*
+** Defines structure for configuring tone generator
+*/
+typedef ProSLIC_Tone_Cfg Si3218x_Tone_Cfg;
+
+/*
+** Defines structure for configuring ring generator
+*/
+typedef struct
+{
+  ramData rtper;
+  ramData freq;
+  ramData amp;
+  ramData phas;
+  ramData offset;
+  ramData slope_ring;
+  ramData iring_lim;
+  ramData rtacth;
+  ramData rtdcth;
+  ramData rtacdb;
+  ramData rtdcdb;
+  ramData vov_ring_bat;
+  ramData vov_ring_gnd;
+  ramData vbatr_expect;
+  uInt8 talo;
+  uInt8 tahi;
+  uInt8 tilo;
+  uInt8 tihi;
+  ramData adap_ring_min_i;
+  ramData counter_iring_val;
+  ramData counter_vtr_val;
+  ramData ar_const28;
+  ramData ar_const32;
+  ramData ar_const38;
+  ramData ar_const46;
+  ramData rrd_delay;
+  ramData rrd_delay2;
+  ramData dcdc_vref_min_rng;
+  uInt8 ringcon;
+  uInt8 userstat;
+  ramData vcm_ring;
+  ramData vcm_ring_fixed;
+  ramData delta_vcm;
+  ramData dcdc_rngtype;
+} Si3218x_Ring_Cfg;
+
+
+
+
+
+/*
+** Function: Si3218x_RevC_GenParamUpdate
+**
+** Description:
+** Update Si3218x general parameters and other required modifications
+** to default reg/ram values
+**
+** Returns:
+** int (error)
+**
+*/
+int Si3218x_GenParamUpdate(proslicChanType_ptr hProslic,initSeqType seq);
+
+
+/*
+** Function: Si3217x_RevC_SelectPatch
+**
+** Description:
+** Select appropriate patch based on general parameters
+**
+** Returns:
+** int (error)
+**
+*/
+int Si3218x_SelectPatch(proslicChanType_ptr hProslic,
+                        const proslicPatch **patch);
+
+/*
+** Function: Si3217x_RevC_ConverterSetup
+**
+** Description:
+** Program revision specific settings before powering converter
+**
+** Specifically, from general parameters and knowledge that this
+** is Rev C, setup dcff drive, gate drive polarity, and charge pump.
+**
+** Returns:
+** int (error)
+**
+*/
+int Si3218x_ConverterSetup(proslicChanType_ptr pProslic);
+
+/*
+** Function: Si3217x_RevC_PulseMeterSetup
+**
+** Description:
+** configure pulse metering
+*/
+int Si3218x_PulseMeterSetup (proslicChanType_ptr hProslic, int preset);
+
+#endif
+
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/inc/si3218x_intf.h b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/inc/si3218x_intf.h
new file mode 100644
index 0000000..af9b057
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/inc/si3218x_intf.h
@@ -0,0 +1,479 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Si3218x ProSLIC interface header file
+ *
+ * Distributed by:
+ * Silicon Laboratories, Inc
+ *
+ * This file contains proprietary information.
+ * No dissemination allowed without prior written permission from
+ * Silicon Laboratories, Inc.
+ *
+ * File Description:
+ * This is the header file for the ProSLIC driver.
+ *
+ *
+ */
+
+#ifndef SI3218X_INTF_H
+#define SI3218X_INTF_H
+#include "si3218x.h"
+
+/* The following macros are for backward compatibility */
+#define Si3218x_LoadPatch                    ProSLIC_LoadPatch
+#define Si3218x_ReadHookStatus               ProSLIC_ReadHookStatus
+#define Si3218x_DCFeedSetup(PCHAN, NDX)      Si3218x_DCFeedSetupCfg((PCHAN),Si3218x_DCfeed_Presets, (NDX))
+#define Si3218x_VerifyPatch		             ProSLIC_VerifyPatch
+#define Si3218x_SetPowersaveMode             ProSLIC_SetPowersaveMode
+#define Si3218x_Init(PCHAN, SZ)              Si3218x_Init_with_Options((PCHAN), (SZ), INIT_NO_OPT)
+#define Si3218x_LoadRegTables                ProSLIC_LoadRegTables
+#define Si3218x_VerifyControlInterface       ProSLIC_VefifyControlInterface
+#define Si3218x_ShutdownChannel              ProSLIC_PowerDownConverter
+#define Si3218x_PowerDownConverter           ProSLIC_PowerDownConverter
+#define Si3218x_Calibrate                    ProSLIC_Calibrate
+#define Si3218x_SetLinefeedStatusBroadcast   ProSLIC_SetLinefeedStatusBroadcast
+#define Si3218x_SetLinefeedStatus            ProSLIC_SetLinefeedStatus
+#define Si3218x_MWIEnable                    ProSLIC_MWIEnable
+#define Si3218x_MWIDisable                   ProSLIC_MWIDisable
+#define Si3218x_SetMWIState                  ProSLIC_SetMWIState
+#define Si3218x_GetMWIState                  ProSLIC_GetMWIState
+#define Si3218x_MWISetup(PCHAN,VPK,LCR)      ProSLIC_MWISetV(PCHAN,VPK)
+
+/* DC Feed */
+#ifndef DISABLE_DCFEED_SETUP
+extern Si3218x_DCfeed_Cfg Si3218x_DCfeed_Presets[];
+#endif
+
+/*
+**
+** PROSLIC INITIALIZATION FUNCTIONS
+**
+*/
+
+/*
+** Function: PROSLIC_Init_MultiBOM
+**
+** Description:
+** Initializes the ProSLIC w/ selected general parameters
+**
+** Input Parameters:
+** pProslic: pointer to PROSLIC object
+** size:     number of channels
+** preset:   General configuration preset
+**
+** Return:
+** none
+*/
+#ifdef SIVOICE_MULTI_BOM_SUPPORT
+int Si3218x_Init_MultiBOM (proslicChanType_ptr *hProslic,int size,int preset);
+#endif
+
+/*
+** Function: Si3218x_Init_with_Options
+**
+** Description:
+** Initializes the ProSLIC with an option.
+**
+** Input Parameters:
+** pProslic: pointer to PROSLIC object
+** size - number of continuous channels to initialize
+** init_opt - which initialization type to do.
+**
+** Return:
+** none
+*/
+int Si3218x_Init_with_Options (proslicChanType_ptr *pProslic, int size,
+                               initOptionsType init_opt);
+
+/*
+** Function: PROSLIC_VerifyControlInterface
+**
+** Description:
+** Verify SPI port read capabilities
+**
+** Input Parameters:
+** pProslic: pointer to PROSLIC object
+**
+** Return:
+** none
+*/
+int Si3218x_VerifyControlInterface (proslicChanType_ptr hProslic);
+
+/*
+** Function: Si3218x_PowerUpConverter
+**
+** Description:
+** Powers all DC/DC converters sequentially with delay to minimize
+** peak power draw on VDC.
+**
+** Returns:
+** int (error)
+**
+*/
+int Si3218x_PowerUpConverter(proslicChanType_ptr hProslic);
+
+/*
+** Function: Si3218x_PowerDownConverter
+**
+** Description:
+** Power down DCDC converter (selected channel only)
+**
+** Returns:
+** int (error)
+**
+*/
+int Si3218x_PowerDownConverter(proslicChanType_ptr hProslic);
+
+/*
+** Function: PROSLIC_EnableInterrupts
+**
+** Description:
+** Enables interrupts
+**
+** Input Parameters:
+** hProslic: pointer to Proslic object
+**
+** Return:
+**
+*/
+int Si3218x_EnableInterrupts (proslicChanType_ptr hProslic);
+
+/*
+**
+** PROSLIC CONFIGURATION FUNCTIONS
+**
+*/
+
+/*
+** Function: PROSLIC_RingSetup
+**
+** Description:
+** configure ringing
+**
+** Input Parameters:
+** pProslic: pointer to Proslic object
+** pRingSetup: pointer to ringing config structure
+**
+** Return:
+** none
+*/
+int Si3218x_RingSetup (proslicChanType *pProslic, int preset);
+
+/*
+** Function: PROSLIC_ZsynthSetup
+**
+** Description:
+** configure impedance synthesis
+**
+** Input Parameters:
+** pProslic: pointer to Proslic object
+** pZynth: pointer to zsynth config structure
+**
+** Return:
+** none
+*/
+int Si3218x_ZsynthSetup (proslicChanType *pProslic, int preset);
+
+/*
+** Function: PROSLIC_AudioGainSetup
+**
+** Description:
+** configure audio gains
+**
+** Input Parameters:
+** pProslic: pointer to Proslic object
+** preset:   impedance preset to scale
+**
+** Return:
+** none
+*/
+int Si3218x_TXAudioGainSetup (proslicChanType *pProslic, int preset);
+int Si3218x_RXAudioGainSetup (proslicChanType *pProslic, int preset);
+#define Si3218x_AudioGainSetup ProSLIC_AudioGainSetup
+
+/*
+** Function: PROSLIC_TXAudioGainScale
+**
+** Description:
+** configure audio gains
+**
+** Input Parameters:
+** pProslic:  pointer to Proslic object
+** preset:    pointer to audio gains config structure
+** pga_scale: pga_scaling constant
+** eq_scale:  equalizer scaling constant
+**
+** Return:
+** none
+*/
+int Si3218x_TXAudioGainScale (proslicChanType *pProslic, int preset,
+                              uInt32 pga_scale, uInt32 eq_scale);
+
+/*
+** Function: PROSLIC_RXAudioGainScale
+**
+** Description:
+** configure audio gains
+**
+** Input Parameters:
+** pProslic:  pointer to Proslic object
+** preset:    pointer to audio gains config structure
+** pga_scale: pga_scaling constant
+** eq_scale:  equalizer scaling constant
+**
+** Return:
+** none
+*/
+int Si3218x_RXAudioGainScale (proslicChanType *pProslic, int preset,
+                              uInt32 pga_scale, uInt32 eq_scale);
+
+/*
+** Function: PROSLIC_AudioEQSetup
+**
+** Description:
+** configure audio equalizers
+**
+** Input Parameters:
+** pProslic: pointer to Proslic object
+** pAudioEQ: pointer to ringing config structure
+**
+** Return:
+** none
+*/
+int Si3218x_AudioEQSetup (proslicChanType *pProslic, int preset);
+
+/*
+** Function: PROSLIC_DCFeedSetup
+**
+** Description:
+** configure dc feed
+**
+** Input Parameters:
+** pProslic: pointer to Proslic object
+** pDcFeed: pointer to dc feed config structure
+**
+** Return:
+** none
+*/
+int Si3218x_DCFeedSetupCfg (proslicChanType *pProslic, ProSLIC_DCfeed_Cfg *cfg,
+                            int preset);
+
+/*
+** Function: PROSLIC_PCMSetup
+**
+** Description:
+** configure pcm
+**
+** Input Parameters:
+** pProslic: pointer to Proslic object
+** pPcm: pointer to pcm config structure
+**
+** Return:
+** none
+*/
+int Si3218x_PCMSetup(proslicChanType *pProslic, int preset);
+
+/*
+**
+** PROSLIC CONTROL FUNCTIONS
+**
+*/
+
+/*
+** Function: PROSLIC_GetInterrupts
+**
+** Description:
+** Enables interrupts
+**
+** Input Parameters:
+** hProslic: pointer to Proslic object
+** pIntData: pointer to interrupt info retrieved
+**
+** Return:
+**
+*/
+int Si3218x_GetInterrupts (proslicChanType_ptr hProslic,
+                           proslicIntType *pIntData);
+
+/*
+** Function: PROSLIC_PulseMeterSetup
+**
+** Description:
+** configure pulse metering
+**
+** Input Parameters:
+** pProslic: pointer to Proslic object
+** pPulseCfg: pointer to pulse metering config structure
+**
+** Return:
+** none
+*/
+int Si3218x_PulseMeterSetup (proslicChanType *pProslic, int preset);
+
+/*
+** Function: PROSLIC_dbgSetDCFeed
+**
+** Description:
+** provision function for setting up
+** dcfeed given desired open circuit voltage
+** and loop current.
+*/
+int Si3218x_dbgSetDCFeed (proslicChanType *pProslic, uInt32 v_vlim_val,
+                          uInt32 i_ilim_val, int32 preset);
+
+/*
+** Function: PROSLIC_dbgSetDCFeedVopen
+**
+** Description:
+** provision function for setting up
+** dcfeed given desired open circuit voltage
+** and loop current.
+*/
+int Si3218x_dbgSetDCFeedVopen (proslicChanType *pProslic, uInt32 v_vlim_val,
+                               int32 preset);
+
+
+/*
+** Function: PROSLIC_dbgSetDCFeedIloop
+**
+** Description:
+** provision function for setting up
+** dcfeed given desired open circuit voltage
+** and loop current.
+*/
+int Si3218x_dbgSetDCFeedIloop (proslicChanType *pProslic, uInt32 i_ilim_val,
+                               int32 preset);
+
+
+/*
+** Function: PROSLIC_dbgRingingSetup
+**
+** Description:
+** Provision function for setting up
+** Ring type, frequency, amplitude and dc offset.
+** Main use will be by peek/poke applications.
+*/
+int Si3218x_dbgSetRinging (proslicChanType *pProslic,
+                           ProSLIC_dbgRingCfg *ringCfg, int preset);
+
+/*
+** Function: PROSLIC_dbgSetRXGain
+**
+** Description:
+** Provision function for setting up
+** RX path gain.
+*/
+int Si3218x_dbgSetRXGain (proslicChanType *pProslic, int32 gain,
+                          int impedance_preset, int audio_gain_preset);
+
+/*
+** Function: PROSLIC_dbgSetTXGain
+**
+** Description:
+** Provision function for setting up
+** TX path gain.
+*/
+int Si3218x_dbgSetTXGain (proslicChanType *pProslic, int32 gain,
+                          int impedance_preset, int audio_gain_preset);
+
+
+/*
+** Function: PROSLIC_LineMonitor
+**
+** Description:
+** Monitor line voltages and currents
+*/
+int Si3218x_LineMonitor(proslicChanType *pProslic, proslicMonitorType *monitor);
+
+
+/*
+** Function: PROSLIC_PSTNCheck
+**
+** Description:
+** Continuous monitor of ilong to detect hot pstn line
+*/
+int Si3218x_PSTNCheck(proslicChanType *pProslic,
+                      proslicPSTNCheckObjType *pstnCheckObj);
+
+
+/*
+** Function: PROSLIC_PSTNCheck
+**
+** Description:
+** Continuous monitor of ilong to detect hot pstn line
+*/
+int Si3218x_DiffPSTNCheck(proslicChanType *pProslic,
+                          proslicDiffPSTNCheckObjType *pstnCheckObj);
+
+/*
+** Function: PROSLIC_ReadMADCScaled
+**
+** Description:
+** Read MADC (or other sensed voltages/currents) and
+** return scaled value in int32 format
+*/
+int32 Si3218x_ReadMADCScaled(proslicChanType_ptr pProslic, uInt16 addr,
+                             int32 scale);
+
+/*
+** Function: Si3218x_GenParamUpdate
+**
+** Description:
+** Update Si3218x general parameters and other required modifications
+** to default reg/ram values
+**
+** Returns:
+** int (error)
+**
+*/
+int Si3218x_GenParamUpdate(proslicChanType_ptr hProslic,initSeqType seq);
+
+
+/*
+** Function: Si3218x_SelectPatch
+**
+** Description:
+** Select appropriate patch based on general parameters
+**
+** Returns:
+** int (error)
+**
+*/
+int Si3218x_SelectPatch(proslicChanType_ptr hProslic,
+                        const proslicPatch **patch);
+
+/*
+** Function: Si3218x_ConverterSetup
+**
+** Description:
+** Program revision specific settings before powering converter
+**
+** Specifically, from general parameters and knowledge that this
+** is Rev C, setup dcff drive, gate drive polarity, and charge pump.
+**
+** Returns:
+** int (error)
+**
+*/
+int Si3218x_ConverterSetup(proslicChanType_ptr pProslic);
+
+/*
+** Function: Si3218x8_PulseMeterSetup
+**
+** Description:
+** configure pulse metering
+*/
+int Si3218x_PulseMeterSetup (proslicChanType_ptr hProslic, int preset);
+
+
+/* 
+** Function: Si3218x_GetChipInfo
+** Description: Returns the specific chipset in the Si3218x family.
+** Input parameters: channel pointer
+** output: either RC_SPI_FAIL or RC_NONE.  channel pointer deviceId will be updated.
+**/
+int Si3218x_GetChipInfo(proslicChanType_ptr pProslic);
+
+
+#endif
+
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/inc/si3218x_registers.h b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/inc/si3218x_registers.h
new file mode 100644
index 0000000..2812803
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/inc/si3218x_registers.h
@@ -0,0 +1,1518 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Distributed by:
+ * Silicon Laboratories, Inc
+ *
+ * This file contains proprietary information.
+ * No dissemination allowed without prior written permission from
+ * Silicon Laboratories, Inc.
+ */
+
+#ifndef SI3218X_REGS_H
+#define SI3218X_REGS_H
+
+/*
+** SI3218X SPI Registers
+*/
+enum SI3218X_REG
+{
+  SI3218X_REG_ID                       = 0,
+  SI3218X_REG_RESET                    = 1,
+  SI3218X_REG_MSTREN                   = 2,
+  SI3218X_REG_MSTRSTAT                 = 3,
+  SI3218X_REG_RAMSTAT                  = 4,
+  SI3218X_REG_RAM_ADDR_HI              = 5,
+  SI3218X_REG_RAM_DATA_B0              = 6,
+  SI3218X_REG_RAM_DATA_B1              = 7,
+  SI3218X_REG_RAM_DATA_B2              = 8,
+  SI3218X_REG_RAM_DATA_B3              = 9,
+  SI3218X_REG_RAM_ADDR_LO              = 10,
+  SI3218X_REG_PCMMODE                  = 11,
+  SI3218X_REG_PCMTXLO                  = 12,
+  SI3218X_REG_PCMTXHI                  = 13,
+  SI3218X_REG_PCMRXLO                  = 14,
+  SI3218X_REG_PCMRXHI                  = 15,
+  SI3218X_REG_IRQ                      = 16,
+  SI3218X_REG_IRQ0                     = 17,
+  SI3218X_REG_IRQ1                     = 18,
+  SI3218X_REG_IRQ2                     = 19,
+  SI3218X_REG_IRQ3                     = 20,
+  SI3218X_REG_IRQ4                     = 21,
+  SI3218X_REG_IRQEN1                   = 22,
+  SI3218X_REG_IRQEN2                   = 23,
+  SI3218X_REG_IRQEN3                   = 24,
+  SI3218X_REG_IRQEN4                   = 25,
+  SI3218X_REG_CALR0                    = 26,
+  SI3218X_REG_CALR1                    = 27,
+  SI3218X_REG_CALR2                    = 28,
+  SI3218X_REG_CALR3                    = 29,
+  SI3218X_REG_LINEFEED                 = 30,
+  SI3218X_REG_POLREV                   = 31,
+  SI3218X_REG_SPEEDUP_DIS              = 32,
+  SI3218X_REG_SPEEDUP                  = 33,
+  SI3218X_REG_LCRRTP                   = 34,
+  SI3218X_REG_OFFLOAD                  = 35,
+  SI3218X_REG_BATSELMAP                = 36,
+  SI3218X_REG_BATSEL                   = 37,
+  SI3218X_REG_RINGCON                  = 38,
+  SI3218X_REG_RINGTALO                 = 39,
+  SI3218X_REG_RINGTAHI                 = 40,
+  SI3218X_REG_RINGTILO                 = 41,
+  SI3218X_REG_RINGTIHI                 = 42,
+  SI3218X_REG_LOOPBACK                 = 43,
+  SI3218X_REG_DIGCON                   = 44,
+  SI3218X_REG_RA                       = 45,
+  SI3218X_REG_ZCAL_EN                  = 46,
+  SI3218X_REG_ENHANCE                  = 47,
+  SI3218X_REG_OMODE                    = 48,
+  SI3218X_REG_OCON                     = 49,
+  SI3218X_REG_O1TALO                   = 50,
+  SI3218X_REG_O1TAHI                   = 51,
+  SI3218X_REG_O1TILO                   = 52,
+  SI3218X_REG_O1TIHI                   = 53,
+  SI3218X_REG_O2TALO                   = 54,
+  SI3218X_REG_O2TAHI                   = 55,
+  SI3218X_REG_O2TILO                   = 56,
+  SI3218X_REG_O2TIHI                   = 57,
+  SI3218X_REG_FSKDAT                   = 58,
+  SI3218X_REG_FSKDEPTH                 = 59,
+  SI3218X_REG_TONDTMF                  = 60,
+  SI3218X_REG_TONDET                   = 61,
+  SI3218X_REG_TONEN                    = 62,
+  SI3218X_REG_GCI_CI                   = 63,
+  SI3218X_REG_GLOBSTAT1                = 64,
+  SI3218X_REG_GLOBSTAT2                = 65,
+  SI3218X_REG_USERSTAT                 = 66,
+  SI3218X_REG_GPIO_CFG1				   = 68,
+  SI3218X_REG_DIAG1                    = 71,
+  SI3218X_REG_DIAG2                    = 72,
+  SI3218X_REG_CM_CLAMP                 = 73,
+  SI3218X_REG_DIAG3                    = 74,
+  SI3218X_REG_PMCON                    = 75,
+  SI3218X_REG_PCLK_FAULT_CNTL          = 76,
+  SI3218X_REG_AUTO                     = 80,
+  SI3218X_REG_JMPEN                    = 81,
+  SI3218X_REG_JMP0LO                   = 82,
+  SI3218X_REG_JMP0HI                   = 83,
+  SI3218X_REG_JMP1LO                   = 84,
+  SI3218X_REG_JMP1HI                   = 85,
+  SI3218X_REG_JMP2LO                   = 86,
+  SI3218X_REG_JMP2HI                   = 87,
+  SI3218X_REG_JMP3LO                   = 88,
+  SI3218X_REG_JMP3HI                   = 89,
+  SI3218X_REG_JMP4LO                   = 90,
+  SI3218X_REG_JMP4HI                   = 91,
+  SI3218X_REG_JMP5LO                   = 92,
+  SI3218X_REG_JMP5HI                   = 93,
+  SI3218X_REG_JMP6LO                   = 94,
+  SI3218X_REG_JMP6HI                   = 95,
+  SI3218X_REG_JMP7LO                   = 96,
+  SI3218X_REG_JMP7HI                   = 97,
+  SI3218X_REG_PDN                      = 98,
+  SI3218X_REG_PDN_STAT                 = 99,
+  SI3218X_REG_PDN2                     = 100,
+  SI3218X_REG_PDN2_STAT                = 101,
+  SI3218X_REG_M1_OSC_LO                = 112,
+  SI3218X_REG_M1_OSC_HI                = 113,
+  SI3218X_REG_BITCNT_LO                = 114,
+  SI3218X_REG_BITCNT_HI                = 115,
+  SI3218X_REG_PCLK_MULT                = 116,
+  SI3218X_REG_RAM_DATA_16              = 117,
+  SI3218X_REG_BYPASS_ADDR_LO           = 118,
+  SI3218X_REG_BYPASS_ADDR_HI           = 119,
+  SI3218X_REG_PC_LO                    = 120,
+  SI3218X_REG_PC_HI                    = 121,
+  SI3218X_REG_PC_SHAD_LO               = 122,
+  SI3218X_REG_PC_SHAD_HI               = 123,
+  SI3218X_REG_PASS_LO                  = 124,
+  SI3218X_REG_PASS_HI                  = 125,
+  SI3218X_REG_TEST_CNTL                = 126,
+  SI3218X_REG_TEST_MODE                = 127,
+};
+
+/*
+** SI3218X_RAM
+*/
+enum SI3218X_RAM
+{
+  SI3218X_RAM_IRNGNG_SENSE             = 0,
+  SI3218X_RAM_MADC_VTIPC               = 1,
+  SI3218X_RAM_MADC_VRINGC              = 2,
+  SI3218X_RAM_MADC_VBAT                = 3,
+  SI3218X_RAM_MADC_VLONG               = 4,
+  SI3218X_RAM_UNUSED5                  = 5,
+  SI3218X_RAM_MADC_VDC                 = 6,
+  SI3218X_RAM_MADC_ILONG               = 7,
+  SI3218X_RAM_MADC_ITIP                = 8,
+  SI3218X_RAM_MADC_IRING               = 9,
+  SI3218X_RAM_MADC_ILOOP               = 10,
+  SI3218X_RAM_VDIFF_SENSE              = 11,
+  SI3218X_RAM_VTIP                     = 12,
+  SI3218X_RAM_VRING                    = 13,
+  SI3218X_RAM_P_Q1_D                   = 14,
+  SI3218X_RAM_INIT_GUESS               = 15,
+  SI3218X_RAM_Y1                       = 16,
+  SI3218X_RAM_Y2                       = 17,
+  SI3218X_RAM_Y3                       = 18,
+  SI3218X_RAM_UNUSED19                 = 19,
+  SI3218X_RAM_P_Q1                     = 20,
+  SI3218X_RAM_DIAG_EX1                 = 21,
+  SI3218X_RAM_DIAG_EX2                 = 22,
+  SI3218X_RAM_DIAG_LPF_MADC            = 23,
+  SI3218X_RAM_DIAG_DMM_I               = 24,
+  SI3218X_RAM_DIAG_DMM_V               = 25,
+  SI3218X_RAM_OSC1FREQ                 = 26,
+  SI3218X_RAM_OSC1AMP                  = 27,
+  SI3218X_RAM_OSC1PHAS                 = 28,
+  SI3218X_RAM_OSC2FREQ                 = 29,
+  SI3218X_RAM_OSC2AMP                  = 30,
+  SI3218X_RAM_OSC2PHAS                 = 31,
+  SI3218X_RAM_TESTB0_1                 = 32,
+  SI3218X_RAM_TESTB1_1                 = 33,
+  SI3218X_RAM_TESTB2_1                 = 34,
+  SI3218X_RAM_TESTA1_1                 = 35,
+  SI3218X_RAM_TESTA2_1                 = 36,
+  SI3218X_RAM_TESTB0_2                 = 37,
+  SI3218X_RAM_TESTB1_2                 = 38,
+  SI3218X_RAM_TESTB2_2                 = 39,
+  SI3218X_RAM_TESTA1_2                 = 40,
+  SI3218X_RAM_TESTA2_2                 = 41,
+  SI3218X_RAM_TESTB0_3                 = 42,
+  SI3218X_RAM_TESTB1_3                 = 43,
+  SI3218X_RAM_TESTB2_3                 = 44,
+  SI3218X_RAM_TESTA1_3                 = 45,
+  SI3218X_RAM_TESTA2_3                 = 46,
+  SI3218X_RAM_TESTPKO                  = 47,
+  SI3218X_RAM_TESTABO                  = 48,
+  SI3218X_RAM_TESTWLN                  = 49,
+  SI3218X_RAM_TESTAVBW                 = 50,
+  SI3218X_RAM_TESTPKFL                 = 51,
+  SI3218X_RAM_TESTAVFL                 = 52,
+  SI3218X_RAM_TESTPKTH                 = 53,
+  SI3218X_RAM_TESTAVTH                 = 54,
+  SI3218X_RAM_DAC_IN_SYNC1             = 55,
+  SI3218X_RAM_BYPASS_REG               = 56,
+  SI3218X_RAM_LCRMASK_CNT              = 57,
+  SI3218X_RAM_DAC_IN_SYNC              = 58,
+  SI3218X_RAM_TEMP                     = 59,
+  SI3218X_RAM_TEMP_ISR                 = 60,
+  SI3218X_RAM_P_Q2                     = 61,
+  SI3218X_RAM_P_Q3                     = 62,
+  SI3218X_RAM_P_Q4                     = 63,
+  SI3218X_RAM_P_Q5                     = 64,
+  SI3218X_RAM_P_Q6                     = 65,
+  SI3218X_RAM_ILOOP_FILT               = 66,
+  SI3218X_RAM_ILONG_FILT               = 67,
+  SI3218X_RAM_VBAT_FILT                = 68,
+  SI3218X_RAM_VDIFF_FILT               = 69,
+  SI3218X_RAM_VCM_FILT                 = 70,
+  SI3218X_RAM_VBAT_CNT                 = 71,
+  SI3218X_RAM_V_VLIM_SCALED            = 72,
+  SI3218X_RAM_V_VLIM_TRACK             = 73,
+  SI3218X_RAM_V_VLIM_MODFEED           = 74,
+  SI3218X_RAM_DIAG_P_OUT               = 75,
+  SI3218X_RAM_DIAG_COUNT               = 76,
+  SI3218X_RAM_ROW0_MAG                 = 77,
+  SI3218X_RAM_ROW1_MAG                 = 78,
+  SI3218X_RAM_ROW2_MAG                 = 79,
+  SI3218X_RAM_ROW3_MAG                 = 80,
+  SI3218X_RAM_COL0_MAG                 = 81,
+  SI3218X_RAM_COL1_MAG                 = 82,
+  SI3218X_RAM_COL2_MAG                 = 83,
+  SI3218X_RAM_COL3_MAG                 = 84,
+  SI3218X_RAM_ROW0_2ND_Y1              = 85,
+  SI3218X_RAM_ROW1_2ND_Y1              = 86,
+  SI3218X_RAM_ROW2_2ND_Y1              = 87,
+  SI3218X_RAM_ROW3_2ND_Y1              = 88,
+  SI3218X_RAM_COL0_2ND_Y1              = 89,
+  SI3218X_RAM_COL1_2ND_Y1              = 90,
+  SI3218X_RAM_COL2_2ND_Y1              = 91,
+  SI3218X_RAM_COL3_2ND_Y1              = 92,
+  SI3218X_RAM_ROW0_2ND_Y2              = 93,
+  SI3218X_RAM_ROW1_2ND_Y2              = 94,
+  SI3218X_RAM_ROW2_2ND_Y2              = 95,
+  SI3218X_RAM_ROW3_2ND_Y2              = 96,
+  SI3218X_RAM_COL0_2ND_Y2              = 97,
+  SI3218X_RAM_COL1_2ND_Y2              = 98,
+  SI3218X_RAM_COL2_2ND_Y2              = 99,
+  SI3218X_RAM_COL3_2ND_Y2              = 100,
+  SI3218X_RAM_DTMF_IN                  = 101,
+  SI3218X_RAM_DTMFDTF_D2_1             = 102,
+  SI3218X_RAM_DTMFDTF_D1_1             = 103,
+  SI3218X_RAM_DTMFDTF_OUT_1            = 104,
+  SI3218X_RAM_DTMFDTF_D2_2             = 105,
+  SI3218X_RAM_DTMFDTF_D1_2             = 106,
+  SI3218X_RAM_DTMFDTF_OUT_2            = 107,
+  SI3218X_RAM_DTMFDTF_D2_3             = 108,
+  SI3218X_RAM_DTMFDTF_D1_3             = 109,
+  SI3218X_RAM_DTMFDTF_OUT_3            = 110,
+  SI3218X_RAM_DTMFDTF_OUT              = 111,
+  SI3218X_RAM_DTMFLPF_D2_1             = 112,
+  SI3218X_RAM_DTMFLPF_D1_1             = 113,
+  SI3218X_RAM_DTMFLPF_OUT_1            = 114,
+  SI3218X_RAM_DTMFLPF_D2_2             = 115,
+  SI3218X_RAM_DTMFLPF_D1_2             = 116,
+  SI3218X_RAM_DTMFLPF_OUT_2            = 117,
+  SI3218X_RAM_DTMF_ROW                 = 118,
+  SI3218X_RAM_DTMFHPF_D2_1             = 119,
+  SI3218X_RAM_DTMFHPF_D1_1             = 120,
+  SI3218X_RAM_DTMFHPF_OUT_1            = 121,
+  SI3218X_RAM_DTMFHPF_D2_2             = 122,
+  SI3218X_RAM_DTMFHPF_D1_2             = 123,
+  SI3218X_RAM_DTMFHPF_OUT_2            = 124,
+  SI3218X_RAM_DTMF_COL                 = 125,
+  SI3218X_RAM_ROW_POWER                = 126,
+  SI3218X_RAM_COL_POWER                = 127,
+  SI3218X_RAM_GP_TIMER                 = 128,
+  SI3218X_RAM_SPR_INTERP_DIF           = 129,
+  SI3218X_RAM_SPR_INTERP_DIF_OUT       = 130,
+  SI3218X_RAM_SPR_INTERP_INT           = 131,
+  SI3218X_RAM_SPR_CNT                  = 132,
+  SI3218X_RAM_ROW0_Y1                  = 133,
+  SI3218X_RAM_ROW0_Y2                  = 134,
+  SI3218X_RAM_ROW1_Y1                  = 135,
+  SI3218X_RAM_ROW1_Y2                  = 136,
+  SI3218X_RAM_ROW2_Y1                  = 137,
+  SI3218X_RAM_ROW2_Y2                  = 138,
+  SI3218X_RAM_ROW3_Y1                  = 139,
+  SI3218X_RAM_ROW3_Y2                  = 140,
+  SI3218X_RAM_COL0_Y1                  = 141,
+  SI3218X_RAM_COL0_Y2                  = 142,
+  SI3218X_RAM_COL1_Y1                  = 143,
+  SI3218X_RAM_COL1_Y2                  = 144,
+  SI3218X_RAM_COL2_Y1                  = 145,
+  SI3218X_RAM_COL2_Y2                  = 146,
+  SI3218X_RAM_COL3_Y1                  = 147,
+  SI3218X_RAM_COL3_Y2                  = 148,
+  SI3218X_RAM_ROWMAX_MAG               = 149,
+  SI3218X_RAM_COLMAX_MAG               = 150,
+  SI3218X_RAM_ROW0_2ND_MAG             = 151,
+  SI3218X_RAM_COL0_2ND_MAG             = 152,
+  SI3218X_RAM_ROW_THR                  = 153,
+  SI3218X_RAM_COL_THR                  = 154,
+  SI3218X_RAM_OSC1_Y                   = 155,
+  SI3218X_RAM_OSC2_Y                   = 156,
+  SI3218X_RAM_OSC1_X                   = 157,
+  SI3218X_RAM_OSC1_COEFF               = 158,
+  SI3218X_RAM_OSC2_X                   = 159,
+  SI3218X_RAM_OSC2_COEFF               = 160,
+  SI3218X_RAM_RXACIIR_D2_1             = 161,
+  SI3218X_RAM_RXACIIR_OUT_1            = 162,
+  SI3218X_RAM_RXACIIR_D2_2             = 163,
+  SI3218X_RAM_RXACIIR_D1_2             = 164,
+  SI3218X_RAM_RXACIIR_OUT_2            = 165,
+  SI3218X_RAM_RXACIIR_D2_3             = 166,
+  SI3218X_RAM_RXACIIR_D1_3             = 167,
+  SI3218X_RAM_RXACIIR_OUT              = 168,
+  SI3218X_RAM_RXACIIR_OUT_3            = 169,
+  SI3218X_RAM_TXACCOMB_D1              = 170,
+  SI3218X_RAM_TXACCOMB_D2              = 171,
+  SI3218X_RAM_TXACCOMB_D3              = 172,
+  SI3218X_RAM_TXACSINC_OUT             = 173,
+  SI3218X_RAM_TXACHPF_D1_2             = 174,
+  SI3218X_RAM_TXACHPF_D2_1             = 175,
+  SI3218X_RAM_TXACHPF_D2_2             = 176,
+  SI3218X_RAM_TXACHPF_OUT              = 177,
+  SI3218X_RAM_TXACHPF_OUT_1            = 178,
+  SI3218X_RAM_TXACHPF_OUT_2            = 179,
+  SI3218X_RAM_TXACIIR_D2_1             = 180,
+  SI3218X_RAM_TXACIIR_OUT_1            = 181,
+  SI3218X_RAM_TXACIIR_D2_2             = 182,
+  SI3218X_RAM_TXACIIR_D1_2             = 183,
+  SI3218X_RAM_TXACIIR_OUT_2            = 184,
+  SI3218X_RAM_TXACIIR_D2_3             = 185,
+  SI3218X_RAM_TXACIIR_D1_3             = 186,
+  SI3218X_RAM_TXACIIR_OUT_3            = 187,
+  SI3218X_RAM_TXACIIR_OUT              = 188,
+  SI3218X_RAM_ECIIR_D1                 = 189,
+  SI3218X_RAM_ECIIR_D2                 = 190,
+  SI3218X_RAM_EC_DELAY1                = 191,
+  SI3218X_RAM_EC_DELAY2                = 192,
+  SI3218X_RAM_EC_DELAY3                = 193,
+  SI3218X_RAM_EC_DELAY4                = 194,
+  SI3218X_RAM_EC_DELAY5                = 195,
+  SI3218X_RAM_EC_DELAY6                = 196,
+  SI3218X_RAM_EC_DELAY7                = 197,
+  SI3218X_RAM_EC_DELAY8                = 198,
+  SI3218X_RAM_EC_DELAY9                = 199,
+  SI3218X_RAM_EC_DELAY10               = 200,
+  SI3218X_RAM_EC_DELAY11               = 201,
+  SI3218X_RAM_ECHO_EST                 = 202,
+  SI3218X_RAM_EC_OUT                   = 203,
+  SI3218X_RAM_TESTFILT_OUT_1           = 204,
+  SI3218X_RAM_TESTFILT_D1_1            = 205,
+  SI3218X_RAM_TESTFILT_D2_1            = 206,
+  SI3218X_RAM_TESTFILT_OUT_2           = 207,
+  SI3218X_RAM_TESTFILT_D1_2            = 208,
+  SI3218X_RAM_TESTFILT_D2_2            = 209,
+  SI3218X_RAM_TESTFILT_OUT_3           = 210,
+  SI3218X_RAM_TESTFILT_D1_3            = 211,
+  SI3218X_RAM_TESTFILT_D2_3            = 212,
+  SI3218X_RAM_TESTFILT_PEAK            = 213,
+  SI3218X_RAM_TESTFILT_ABS             = 214,
+  SI3218X_RAM_TESTFILT_MEANACC         = 215,
+  SI3218X_RAM_TESTFILT_COUNT           = 216,
+  SI3218X_RAM_TESTFILT_NO_OFFSET       = 217,
+  SI3218X_RAM_RING_X                   = 218,
+  SI3218X_RAM_RING_Y                   = 219,
+  SI3218X_RAM_RING_INT                 = 220,
+  SI3218X_RAM_RING_Y_D1                = 221,
+  SI3218X_RAM_RING_DIFF                = 222,
+  SI3218X_RAM_RING_DELTA               = 223,
+  SI3218X_RAM_WTCHDOG_CNT              = 224,
+  SI3218X_RAM_RING_WAVE                = 225,
+  SI3218X_RAM_UNUSED226                = 226,
+  SI3218X_RAM_ONEKHZ_COUNT             = 227,
+  SI3218X_RAM_TX2100_Y1                = 228,
+  SI3218X_RAM_TX2100_Y2                = 229,
+  SI3218X_RAM_TX2100_MAG               = 230,
+  SI3218X_RAM_RX2100_Y1                = 231,
+  SI3218X_RAM_RX2100_Y2                = 232,
+  SI3218X_RAM_RX2100_MAG               = 233,
+  SI3218X_RAM_TX2100_POWER             = 234,
+  SI3218X_RAM_RX2100_POWER             = 235,
+  SI3218X_RAM_TX2100_IN                = 236,
+  SI3218X_RAM_RX2100_IN                = 237,
+  SI3218X_RAM_RINGTRIP_COUNT           = 238,
+  SI3218X_RAM_RINGTRIP_DC1             = 239,
+  SI3218X_RAM_RINGTRIP_DC2             = 240,
+  SI3218X_RAM_RINGTRIP_AC1             = 241,
+  SI3218X_RAM_RINGTRIP_AC2             = 242,
+  SI3218X_RAM_RINGTRIP_AC_COUNT        = 243,
+  SI3218X_RAM_RINGTRIP_DC_COUNT        = 244,
+  SI3218X_RAM_RINGTRIP_AC_RESULT       = 245,
+  SI3218X_RAM_RINGTRIP_DC_RESULT       = 246,
+  SI3218X_RAM_RINGTRIP_ABS             = 247,
+  SI3218X_RAM_TXACEQ_OUT               = 248,
+  SI3218X_RAM_LCR_DBI_CNT              = 249,
+  SI3218X_RAM_BAT_DBI_CNT              = 250,
+  SI3218X_RAM_LONG_DBI_CNT             = 251,
+  SI3218X_RAM_TXACEQ_DELAY3            = 252,
+  SI3218X_RAM_TXACEQ_DELAY2            = 253,
+  SI3218X_RAM_TXACEQ_DELAY1            = 254,
+  SI3218X_RAM_RXACEQ_DELAY3            = 255,
+  SI3218X_RAM_RXACEQ_DELAY2            = 256,
+  SI3218X_RAM_RXACEQ_DELAY1            = 257,
+  SI3218X_RAM_RXACEQ_IN                = 258,
+  SI3218X_RAM_TXDCCOMB_D1              = 259,
+  SI3218X_RAM_TXDCCOMB_D2              = 260,
+  SI3218X_RAM_TXDCSINC_OUT             = 261,
+  SI3218X_RAM_RXACDIFF_D1              = 262,
+  SI3218X_RAM_DC_NOTCH_1               = 263,
+  SI3218X_RAM_DC_NOTCH_2               = 264,
+  SI3218X_RAM_DC_NOTCH_OUT             = 265,
+  SI3218X_RAM_DC_NOTCH_SCALED          = 266,
+  SI3218X_RAM_V_FEED_IN                = 267,
+  SI3218X_RAM_I_TAR                    = 268,
+  SI3218X_RAM_CONST_VLIM               = 269,
+  SI3218X_RAM_UNITY                    = 270,
+  SI3218X_RAM_TXACNOTCH_1              = 271,
+  SI3218X_RAM_TXACNOTCH_2              = 272,
+  SI3218X_RAM_TXACNOTCH_OUT            = 273,
+  SI3218X_RAM_ZSYNTH_1                 = 274,
+  SI3218X_RAM_ZSYNTH_2                 = 275,
+  SI3218X_RAM_ZSYNTH_OUT_1             = 276,
+  SI3218X_RAM_TXACD2_1_0               = 277,
+  SI3218X_RAM_TXACD2_1_1               = 278,
+  SI3218X_RAM_TXACD2_1_2               = 279,
+  SI3218X_RAM_TXACD2_1_3               = 280,
+  SI3218X_RAM_TXACD2_1_4               = 281,
+  SI3218X_RAM_TXACD2_1_5               = 282,
+  SI3218X_RAM_TXACD2_1_OUT             = 283,
+  SI3218X_RAM_TXACD2_2_0               = 284,
+  SI3218X_RAM_TXACD2_2_1               = 285,
+  SI3218X_RAM_TXACD2_2_2               = 286,
+  SI3218X_RAM_TXACD2_2_3               = 287,
+  SI3218X_RAM_TXACD2_2_4               = 288,
+  SI3218X_RAM_TXACD2_2_5               = 289,
+  SI3218X_RAM_TXACD2_2_OUT             = 290,
+  SI3218X_RAM_TXACD2_3_0               = 291,
+  SI3218X_RAM_TXACD2_3_1               = 292,
+  SI3218X_RAM_TXACD2_3_2               = 293,
+  SI3218X_RAM_TXACD2_3_3               = 294,
+  SI3218X_RAM_TXACD2_3_4               = 295,
+  SI3218X_RAM_TXACD2_3_5               = 296,
+  SI3218X_RAM_TXACD2_3_OUT             = 297,
+  SI3218X_RAM_RXACI2_1_1               = 298,
+  SI3218X_RAM_RXACI2_1_2               = 299,
+  SI3218X_RAM_RXACI2_1_3               = 300,
+  SI3218X_RAM_RXACI2_1_4               = 301,
+  SI3218X_RAM_RXACI2_1_OUT             = 302,
+  SI3218X_RAM_RXACI2_2_1               = 303,
+  SI3218X_RAM_RXACI2_2_2               = 304,
+  SI3218X_RAM_RXACI2_2_3               = 305,
+  SI3218X_RAM_RXACI2_2_4               = 306,
+  SI3218X_RAM_RXACI2_2_OUT             = 307,
+  SI3218X_RAM_RXACI2_3_1               = 308,
+  SI3218X_RAM_RXACI2_3_2               = 309,
+  SI3218X_RAM_RXACI2_3_3               = 310,
+  SI3218X_RAM_RXACI2_3_4               = 311,
+  SI3218X_RAM_RXACI2_3_OUT             = 312,
+  SI3218X_RAM_TXACCOMP1                = 313,
+  SI3218X_RAM_TXACCOMP_OUT             = 314,
+  SI3218X_RAM_RXACCOMP1                = 315,
+  SI3218X_RAM_RXACCOMP_OUT             = 316,
+  SI3218X_RAM_RXACHPF_D1_2             = 317,
+  SI3218X_RAM_RXACHPF_D2_1             = 318,
+  SI3218X_RAM_RXACHPF_D2_2             = 319,
+  SI3218X_RAM_RXACHPF_OUT              = 320,
+  SI3218X_RAM_RXACHPF_OUT_1            = 321,
+  SI3218X_RAM_RXACHPF_OUT_2            = 322,
+  SI3218X_RAM_RXACEQ_OUT               = 323,
+  SI3218X_RAM_METER_I_1                = 324,
+  SI3218X_RAM_METER_I_OUT              = 325,
+  SI3218X_RAM_METER_LPF_1              = 326,
+  SI3218X_RAM_METER_LPF_2              = 327,
+  SI3218X_RAM_METER_LPF_OUT            = 328,
+  SI3218X_RAM_METER_BP_1               = 329,
+  SI3218X_RAM_METER_BP_2               = 330,
+  SI3218X_RAM_METER_BP_OUT             = 331,
+  SI3218X_RAM_METER_SRC_OUT            = 332,
+  SI3218X_RAM_UNUSED333                = 333,
+  SI3218X_RAM_UNUSED334                = 334,
+  SI3218X_RAM_RING_LPF_1               = 335,
+  SI3218X_RAM_RING_LPF_2               = 336,
+  SI3218X_RAM_RING_LPF_OUT             = 337,
+  SI3218X_RAM_RING_INTERP_DIFF         = 338,
+  SI3218X_RAM_RING_INTERP_DIFF_OUT     = 339,
+  SI3218X_RAM_RING_INTERP_INT          = 340,
+  SI3218X_RAM_RING_INTERP_INT_OUT      = 341,
+  SI3218X_RAM_V_ILIM_TRACK             = 342,
+  SI3218X_RAM_V_RFEED_TRACK            = 343,
+  SI3218X_RAM_LF_SPEEDUP_CNT           = 344,
+  SI3218X_RAM_DC_SPEEDUP_CNT           = 345,
+  SI3218X_RAM_AC_SPEEDUP_CNT           = 346,
+  SI3218X_RAM_LCR_SPEEDUP_CNT          = 347,
+  SI3218X_RAM_CM_SPEEDUP_CNT           = 348,
+  SI3218X_RAM_DC_SPEEDUP_MASK          = 349,
+  SI3218X_RAM_ZSYNTH_IN                = 350,
+  SI3218X_RAM_I_TAR_SAVE               = 351,
+  SI3218X_RAM_UNUSED352                = 352,
+  SI3218X_RAM_UNUSED353                = 353,
+  SI3218X_RAM_COUNTER_VTR              = 354,
+  SI3218X_RAM_I_RING_AVG               = 355,
+  SI3218X_RAM_COUNTER_IRING            = 356,
+  SI3218X_RAM_COMP_RATIO               = 357,
+  SI3218X_RAM_MADC_VBAT_DIV2           = 358,
+  SI3218X_RAM_VDIFF_PK_T               = 359,
+  SI3218X_RAM_PEAK_CNT                 = 360,
+  SI3218X_RAM_CM_DBI_CNT               = 361,
+  SI3218X_RAM_VCM_LAST                 = 362,
+  SI3218X_RAM_VBATL_SENSE              = 363,
+  SI3218X_RAM_VBATH_SENSE              = 364,
+  SI3218X_RAM_VBATR_SENSE              = 365,
+  SI3218X_RAM_BAT_SETTLE_CNT           = 366,
+  SI3218X_RAM_VBAT_TGT                 = 367,
+  SI3218X_RAM_VBAT_REQ                 = 368,
+  SI3218X_RAM_VCM_HIRES                = 369,
+  SI3218X_RAM_VCM_LORES                = 370,
+  SI3218X_RAM_ILOOP1                   = 371,
+  SI3218X_RAM_ILONG2                   = 372,
+  SI3218X_RAM_ITIP1                    = 373,
+  SI3218X_RAM_IRING1                   = 374,
+  SI3218X_RAM_CAL_TEMP1                = 375,
+  SI3218X_RAM_CAL_TEMP2                = 376,
+  SI3218X_RAM_CAL_TEMP3                = 377,
+  SI3218X_RAM_CAL_TEMP4                = 378,
+  SI3218X_RAM_CAL_TEMP5                = 379,
+  SI3218X_RAM_CAL_TEMP6                = 380,
+  SI3218X_RAM_CAL_TEMP7                = 381,
+  SI3218X_RAM_CMRR_DIVISOR             = 382,
+  SI3218X_RAM_CMRR_REMAINDER           = 383,
+  SI3218X_RAM_CMRR_Q_PTR               = 384,
+  SI3218X_RAM_I_SOURCE1                = 385,
+  SI3218X_RAM_I_SOURCE2                = 386,
+  SI3218X_RAM_VTR1                     = 387,
+  SI3218X_RAM_VTR2                     = 388,
+  SI3218X_RAM_STOP_TIMER1              = 389,
+  SI3218X_RAM_STOP_TIMER2              = 390,
+  SI3218X_RAM_UNUSED391                = 391,
+  SI3218X_RAM_UNUSED392                = 392,
+  SI3218X_RAM_CAL_ONHK_Z               = 393,
+  SI3218X_RAM_CAL_LB_SETTLE            = 394,
+  SI3218X_RAM_CAL_DECLPF_V0            = 395,
+  SI3218X_RAM_CAL_DECLPF_V1            = 396,
+  SI3218X_RAM_CAL_DECLPF_V2            = 397,
+  SI3218X_RAM_CAL_GOERTZEL_V0          = 398,
+  SI3218X_RAM_CAL_GOERTZEL_V1          = 399,
+  SI3218X_RAM_CAL_DECLPF_Y             = 400,
+  SI3218X_RAM_CAL_GOERTZEL_Y           = 401,
+  SI3218X_RAM_P_HVIC                   = 402,
+  SI3218X_RAM_VBATL_MIRROR             = 403,
+  SI3218X_RAM_VBATH_MIRROR             = 404,
+  SI3218X_RAM_VBATR_MIRROR             = 405,
+  SI3218X_RAM_DIAG_EX1_OUT             = 406,
+  SI3218X_RAM_DIAG_EX2_OUT             = 407,
+  SI3218X_RAM_DIAG_DMM_V_OUT           = 408,
+  SI3218X_RAM_DIAG_DMM_I_OUT           = 409,
+  SI3218X_RAM_DIAG_P                   = 410,
+  SI3218X_RAM_DIAG_LPF_V               = 411,
+  SI3218X_RAM_DIAG_LPF_I               = 412,
+  SI3218X_RAM_DIAG_TONE_FLAG           = 413,
+  SI3218X_RAM_ILOOP1_LAST              = 414,
+  SI3218X_RAM_RING_ENTRY_VOC           = 415,
+  SI3218X_RAM_UNUSED416                = 416,
+  SI3218X_RAM_OSC1_X_SAVE              = 417,
+  SI3218X_RAM_EZSYNTH_1                = 418,
+  SI3218X_RAM_EZSYNTH_2                = 419,
+  SI3218X_RAM_ZSYNTH_OUT               = 420,
+  SI3218X_RAM_UNUSED421                = 421,
+  SI3218X_RAM_CAL_SUBSTATE             = 422,
+  SI3218X_RAM_DIAG_EX1_DC_OUT          = 423,
+  SI3218X_RAM_DIAG_EX1_DC              = 424,
+  SI3218X_RAM_EZSYNTH_B1               = 425,
+  SI3218X_RAM_EZSYNTH_B2               = 426,
+  SI3218X_RAM_EZSYNTH_A1               = 427,
+  SI3218X_RAM_EZSYNTH_A2               = 428,
+  SI3218X_RAM_ILOOP1_FILT              = 429,
+  SI3218X_RAM_AC_PU_DELTA1_CNT         = 430,
+  SI3218X_RAM_AC_PU_DELTA2_CNT         = 431,
+  SI3218X_RAM_UNUSED432                = 432,
+  SI3218X_RAM_UNUSED433                = 433,
+  SI3218X_RAM_UNUSED434                = 434,
+  SI3218X_RAM_AC_DAC_GAIN_SAVE         = 435,
+  SI3218X_RAM_RING_FLUSH_CNT           = 436,
+  SI3218X_RAM_UNUSED437                = 437,
+  SI3218X_RAM_DIAG_VAR_OUT             = 438,
+  SI3218X_RAM_I_VBAT                   = 439,
+  SI3218X_RAM_UNUSED440                = 440,
+  SI3218X_RAM_CALTMP_LOOPCNT           = 441,
+  SI3218X_RAM_CALTMP_LOOPINC           = 442,
+  SI3218X_RAM_UNUSED443                = 443,
+  SI3218X_RAM_CALTMP_CODEINC           = 444,
+  SI3218X_RAM_CALTMP_TAUINC            = 445,
+  SI3218X_RAM_CALTMP_TAU               = 446,
+  SI3218X_RAM_CAL_TEMP8                = 447,
+  SI3218X_RAM_PATCHID                  = 448,
+  SI3218X_RAM_UNUSED449                = 449,
+  SI3218X_RAM_UNUSED450                = 450,
+  SI3218X_RAM_UNUSED451                = 451,
+  SI3218X_RAM_CAL_LB_OFFSET_FWD        = 452,
+  SI3218X_RAM_CAL_LB_OFFSET_RVS        = 453,
+  SI3218X_RAM_COUNT_SPEEDUP            = 454,
+  SI3218X_RAM_SWEEP_COUNT              = 455,
+  SI3218X_RAM_AMP_RAMP                 = 456,
+  SI3218X_RAM_DIAG_LPF_MADC_D          = 457,
+  SI3218X_RAM_DIAG_HPF_MADC            = 458,
+  SI3218X_RAM_UNUSED459                = 459,
+  SI3218X_RAM_TXDEC_OUT                = 460,
+  SI3218X_RAM_TXDEC_D1                 = 461,
+  SI3218X_RAM_TXDEC_D2                 = 462,
+  SI3218X_RAM_RXDEC_D1                 = 463,
+  SI3218X_RAM_RXDEC_D2                 = 464,
+  SI3218X_RAM_OSCINT1_D2_1             = 465,
+  SI3218X_RAM_OSCINT1_D1_1             = 466,
+  SI3218X_RAM_OSCINT1_OUT_1            = 467,
+  SI3218X_RAM_OSCINT1_D2_2             = 468,
+  SI3218X_RAM_OSCINT1_D1_2             = 469,
+  SI3218X_RAM_OSCINT1_OUT              = 470,
+  SI3218X_RAM_OSCINT2_D2_1             = 471,
+  SI3218X_RAM_OSCINT2_D1_1             = 472,
+  SI3218X_RAM_OSCINT2_OUT_1            = 473,
+  SI3218X_RAM_OSCINT2_D2_2             = 474,
+  SI3218X_RAM_OSCINT2_D1_2             = 475,
+  SI3218X_RAM_OSCINT2_OUT              = 476,
+  SI3218X_RAM_OSC1_Y_SAVE              = 477,
+  SI3218X_RAM_OSC2_Y_SAVE              = 478,
+  SI3218X_RAM_PWRSAVE_CNT              = 479,
+  SI3218X_RAM_VBATR_PK                 = 480,
+  SI3218X_RAM_SPEEDUP_MASK_CNT         = 481,
+  SI3218X_RAM_VCM_RING_FIXED           = 482,
+  SI3218X_RAM_DELTA_VCM                = 483,
+  SI3218X_RAM_MADC_VTIPC_DIAG_OS       = 484,
+  SI3218X_RAM_MADC_VRINGC_DIAG_OS      = 485,
+  SI3218X_RAM_MADC_VLONG_DIAG_OS       = 486,
+  SI3218X_RAM_UNUSED487                = 487,
+  SI3218X_RAM_UNUSED488                = 488,
+  SI3218X_RAM_UNUSED489                = 489,
+  SI3218X_RAM_UNUSED490                = 490,
+  SI3218X_RAM_UNUSED491                = 491,
+  SI3218X_RAM_PWRSAVE_DBI_CNT          = 492,
+  SI3218X_RAM_COMP_RATIO_SAVE          = 493,
+  SI3218X_RAM_CAL_TEMP9                = 494,
+  SI3218X_RAM_CAL_TEMP10               = 495,
+  SI3218X_RAM_DAC_OFFSET_TEMP          = 496,
+  SI3218X_RAM_CAL_DAC_CODE             = 497,
+  SI3218X_RAM_DCDAC_OFFSET             = 498,
+  SI3218X_RAM_VDIFF_COARSE             = 499,
+  SI3218X_RAM_RXACIIR_OUT_4            = 500,
+  SI3218X_RAM_CAL_TEMP11               = 501,
+  SI3218X_RAM_METER_RAMP               = 502,
+  SI3218X_RAM_METER_RAMP_DIR           = 503,
+  SI3218X_RAM_METER_ON_T               = 504,
+  SI3218X_RAM_METER_PK_DET             = 505,
+  SI3218X_RAM_METER_PK_DET_T           = 506,
+  SI3218X_RAM_THERM_CNT                = 507,
+  SI3218X_RAM_VDIFF_SENSE_DELAY        = 508,
+  SI3218X_RAM_RING_INTERP_DIFF_SYNC    = 509,
+  SI3218X_RAM_CPUMP_DEB_CNT            = 510,
+  SI3218X_RAM_UNUSED511                = 511,
+  SI3218X_RAM_MINUS_ONE                = 512,
+  SI3218X_RAM_ILOOPLPF                 = 513,
+  SI3218X_RAM_ILONGLPF                 = 514,
+  SI3218X_RAM_BATLPF                   = 515,
+  SI3218X_RAM_VDIFFLPF                 = 516,
+  SI3218X_RAM_VCMLPF                   = 517,
+  SI3218X_RAM_TXACIIR_B0_1             = 518,
+  SI3218X_RAM_TXACIIR_B1_1             = 519,
+  SI3218X_RAM_TXACIIR_A1_1             = 520,
+  SI3218X_RAM_TXACIIR_B0_2             = 521,
+  SI3218X_RAM_TXACIIR_B1_2             = 522,
+  SI3218X_RAM_TXACIIR_B2_2             = 523,
+  SI3218X_RAM_TXACIIR_A1_2             = 524,
+  SI3218X_RAM_TXACIIR_A2_2             = 525,
+  SI3218X_RAM_TXACIIR_B0_3             = 526,
+  SI3218X_RAM_TXACIIR_B1_3             = 527,
+  SI3218X_RAM_TXACIIR_B2_3             = 528,
+  SI3218X_RAM_TXACIIR_A1_3             = 529,
+  SI3218X_RAM_TXACIIR_A2_3             = 530,
+  SI3218X_RAM_TXACHPF_B0_1             = 531,
+  SI3218X_RAM_TXACHPF_B1_1             = 532,
+  SI3218X_RAM_TXACHPF_A1_1             = 533,
+  SI3218X_RAM_TXACHPF_B0_2             = 534,
+  SI3218X_RAM_TXACHPF_B1_2             = 535,
+  SI3218X_RAM_TXACHPF_B2_2             = 536,
+  SI3218X_RAM_TXACHPF_A1_2             = 537,
+  SI3218X_RAM_TXACHPF_A2_2             = 538,
+  SI3218X_RAM_TXACHPF_GAIN             = 539,
+  SI3218X_RAM_TXACEQ_C0                = 540,
+  SI3218X_RAM_TXACEQ_C1                = 541,
+  SI3218X_RAM_TXACEQ_C2                = 542,
+  SI3218X_RAM_TXACEQ_C3                = 543,
+  SI3218X_RAM_TXACGAIN                 = 544,
+  SI3218X_RAM_RXACGAIN                 = 545,
+  SI3218X_RAM_RXACEQ_C0                = 546,
+  SI3218X_RAM_RXACEQ_C1                = 547,
+  SI3218X_RAM_RXACEQ_C2                = 548,
+  SI3218X_RAM_RXACEQ_C3                = 549,
+  SI3218X_RAM_RXACIIR_B0_1             = 550,
+  SI3218X_RAM_RXACIIR_B1_1             = 551,
+  SI3218X_RAM_RXACIIR_A1_1             = 552,
+  SI3218X_RAM_RXACIIR_B0_2             = 553,
+  SI3218X_RAM_RXACIIR_B1_2             = 554,
+  SI3218X_RAM_RXACIIR_B2_2             = 555,
+  SI3218X_RAM_RXACIIR_A1_2             = 556,
+  SI3218X_RAM_RXACIIR_A2_2             = 557,
+  SI3218X_RAM_RXACIIR_B0_3             = 558,
+  SI3218X_RAM_RXACIIR_B1_3             = 559,
+  SI3218X_RAM_RXACIIR_B2_3             = 560,
+  SI3218X_RAM_RXACIIR_A1_3             = 561,
+  SI3218X_RAM_RXACIIR_A2_3             = 562,
+  SI3218X_RAM_ECFIR_C2                 = 563,
+  SI3218X_RAM_ECFIR_C3                 = 564,
+  SI3218X_RAM_ECFIR_C4                 = 565,
+  SI3218X_RAM_ECFIR_C5                 = 566,
+  SI3218X_RAM_ECFIR_C6                 = 567,
+  SI3218X_RAM_ECFIR_C7                 = 568,
+  SI3218X_RAM_ECFIR_C8                 = 569,
+  SI3218X_RAM_ECFIR_C9                 = 570,
+  SI3218X_RAM_ECIIR_B0                 = 571,
+  SI3218X_RAM_ECIIR_B1                 = 572,
+  SI3218X_RAM_ECIIR_A1                 = 573,
+  SI3218X_RAM_ECIIR_A2                 = 574,
+  SI3218X_RAM_DTMFDTF_B0_1             = 575,
+  SI3218X_RAM_DTMFDTF_B1_1             = 576,
+  SI3218X_RAM_DTMFDTF_B2_1             = 577,
+  SI3218X_RAM_DTMFDTF_A1_1             = 578,
+  SI3218X_RAM_DTMFDTF_A2_1             = 579,
+  SI3218X_RAM_DTMFDTF_B0_2             = 580,
+  SI3218X_RAM_DTMFDTF_B1_2             = 581,
+  SI3218X_RAM_DTMFDTF_B2_2             = 582,
+  SI3218X_RAM_DTMFDTF_A1_2             = 583,
+  SI3218X_RAM_DTMFDTF_A2_2             = 584,
+  SI3218X_RAM_DTMFDTF_B0_3             = 585,
+  SI3218X_RAM_DTMFDTF_B1_3             = 586,
+  SI3218X_RAM_DTMFDTF_B2_3             = 587,
+  SI3218X_RAM_DTMFDTF_A1_3             = 588,
+  SI3218X_RAM_DTMFDTF_A2_3             = 589,
+  SI3218X_RAM_DTMFDTF_GAIN             = 590,
+  SI3218X_RAM_DTMFLPF_B0_1             = 591,
+  SI3218X_RAM_DTMFLPF_B1_1             = 592,
+  SI3218X_RAM_DTMFLPF_B2_1             = 593,
+  SI3218X_RAM_DTMFLPF_A1_1             = 594,
+  SI3218X_RAM_DTMFLPF_A2_1             = 595,
+  SI3218X_RAM_DTMFLPF_B0_2             = 596,
+  SI3218X_RAM_DTMFLPF_B1_2             = 597,
+  SI3218X_RAM_DTMFLPF_B2_2             = 598,
+  SI3218X_RAM_DTMFLPF_A1_2             = 599,
+  SI3218X_RAM_DTMFLPF_A2_2             = 600,
+  SI3218X_RAM_DTMFLPF_GAIN             = 601,
+  SI3218X_RAM_DTMFHPF_B0_1             = 602,
+  SI3218X_RAM_DTMFHPF_B1_1             = 603,
+  SI3218X_RAM_DTMFHPF_B2_1             = 604,
+  SI3218X_RAM_DTMFHPF_A1_1             = 605,
+  SI3218X_RAM_DTMFHPF_A2_1             = 606,
+  SI3218X_RAM_DTMFHPF_B0_2             = 607,
+  SI3218X_RAM_DTMFHPF_B1_2             = 608,
+  SI3218X_RAM_DTMFHPF_B2_2             = 609,
+  SI3218X_RAM_DTMFHPF_A1_2             = 610,
+  SI3218X_RAM_DTMFHPF_A2_2             = 611,
+  SI3218X_RAM_DTMFHPF_GAIN             = 612,
+  SI3218X_RAM_POWER_GAIN               = 613,
+  SI3218X_RAM_GOERTZEL_GAIN            = 614,
+  SI3218X_RAM_MODEM_GAIN               = 615,
+  SI3218X_RAM_HOTBIT1                  = 616,
+  SI3218X_RAM_HOTBIT0                  = 617,
+  SI3218X_RAM_ROW0_C1                  = 618,
+  SI3218X_RAM_ROW1_C1                  = 619,
+  SI3218X_RAM_ROW2_C1                  = 620,
+  SI3218X_RAM_ROW3_C1                  = 621,
+  SI3218X_RAM_COL0_C1                  = 622,
+  SI3218X_RAM_COL1_C1                  = 623,
+  SI3218X_RAM_COL2_C1                  = 624,
+  SI3218X_RAM_COL3_C1                  = 625,
+  SI3218X_RAM_ROW0_C2                  = 626,
+  SI3218X_RAM_ROW1_C2                  = 627,
+  SI3218X_RAM_ROW2_C2                  = 628,
+  SI3218X_RAM_ROW3_C2                  = 629,
+  SI3218X_RAM_COL0_C2                  = 630,
+  SI3218X_RAM_COL1_C2                  = 631,
+  SI3218X_RAM_COL2_C2                  = 632,
+  SI3218X_RAM_COL3_C2                  = 633,
+  SI3218X_RAM_SLOPE_VLIM               = 634,
+  SI3218X_RAM_SLOPE_RFEED              = 635,
+  SI3218X_RAM_SLOPE_ILIM               = 636,
+  SI3218X_RAM_SLOPE_RING               = 637,
+  SI3218X_RAM_SLOPE_DELTA1             = 638,
+  SI3218X_RAM_SLOPE_DELTA2             = 639,
+  SI3218X_RAM_V_VLIM                   = 640,
+  SI3218X_RAM_V_RFEED                  = 641,
+  SI3218X_RAM_V_ILIM                   = 642,
+  SI3218X_RAM_CONST_RFEED              = 643,
+  SI3218X_RAM_CONST_ILIM               = 644,
+  SI3218X_RAM_I_VLIM                   = 645,
+  SI3218X_RAM_DC_DAC_GAIN              = 646,
+  SI3218X_RAM_VDIFF_TH                 = 647,
+  SI3218X_RAM_TXDEC_B0                 = 648,
+  SI3218X_RAM_TXDEC_B1                 = 649,
+  SI3218X_RAM_TXDEC_B2                 = 650,
+  SI3218X_RAM_TXDEC_A1                 = 651,
+  SI3218X_RAM_TXDEC_A2                 = 652,
+  SI3218X_RAM_ZSYNTH_B0                = 653,
+  SI3218X_RAM_ZSYNTH_B1                = 654,
+  SI3218X_RAM_ZSYNTH_B2                = 655,
+  SI3218X_RAM_ZSYNTH_A1                = 656,
+  SI3218X_RAM_ZSYNTH_A2                = 657,
+  SI3218X_RAM_RXACHPF_B0_1             = 658,
+  SI3218X_RAM_RXACHPF_B1_1             = 659,
+  SI3218X_RAM_RXACHPF_A1_1             = 660,
+  SI3218X_RAM_RXACHPF_B0_2             = 661,
+  SI3218X_RAM_RXACHPF_B1_2             = 662,
+  SI3218X_RAM_RXACHPF_B2_2             = 663,
+  SI3218X_RAM_RXACHPF_A1_2             = 664,
+  SI3218X_RAM_RXACHPF_A2_2             = 665,
+  SI3218X_RAM_RXACHPF_GAIN             = 666,
+  SI3218X_RAM_MASK7LSB                 = 667,
+  SI3218X_RAM_RXDEC_B0                 = 668,
+  SI3218X_RAM_RXDEC_B1                 = 669,
+  SI3218X_RAM_RXDEC_B2                 = 670,
+  SI3218X_RAM_RXDEC_A1                 = 671,
+  SI3218X_RAM_RXDEC_A2                 = 672,
+  SI3218X_RAM_OSCINT1_B0_1             = 673,
+  SI3218X_RAM_OSCINT1_B1_1             = 674,
+  SI3218X_RAM_OSCINT1_B2_1             = 675,
+  SI3218X_RAM_OSCINT1_A1_1             = 676,
+  SI3218X_RAM_OSCINT1_A2_1             = 677,
+  SI3218X_RAM_OSCINT1_B0_2             = 678,
+  SI3218X_RAM_OSCINT1_B1_2             = 679,
+  SI3218X_RAM_OSCINT1_B2_2             = 680,
+  SI3218X_RAM_OSCINT1_A1_2             = 681,
+  SI3218X_RAM_OSCINT1_A2_2             = 682,
+  SI3218X_RAM_OSCINT2_B0_1             = 683,
+  SI3218X_RAM_OSCINT2_B1_1             = 684,
+  SI3218X_RAM_OSCINT2_B2_1             = 685,
+  SI3218X_RAM_OSCINT2_A1_1             = 686,
+  SI3218X_RAM_OSCINT2_A2_1             = 687,
+  SI3218X_RAM_OSCINT2_B0_2             = 688,
+  SI3218X_RAM_OSCINT2_B1_2             = 689,
+  SI3218X_RAM_OSCINT2_B2_2             = 690,
+  SI3218X_RAM_OSCINT2_A1_2             = 691,
+  SI3218X_RAM_OSCINT2_A2_2             = 692,
+  SI3218X_RAM_UNUSED693                = 693,
+  SI3218X_RAM_UNUSED694                = 694,
+  SI3218X_RAM_UNUSED695                = 695,
+  SI3218X_RAM_RING_LPF_B0              = 696,
+  SI3218X_RAM_RING_LPF_B1              = 697,
+  SI3218X_RAM_RING_LPF_B2              = 698,
+  SI3218X_RAM_RING_LPF_A1              = 699,
+  SI3218X_RAM_RING_LPF_A2              = 700,
+  SI3218X_RAM_LCRDBI                   = 701,
+  SI3218X_RAM_LONGDBI                  = 702,
+  SI3218X_RAM_VBAT_TIMER               = 703,
+  SI3218X_RAM_LF_SPEEDUP_TIMER         = 704,
+  SI3218X_RAM_DC_SPEEDUP_TIMER         = 705,
+  SI3218X_RAM_AC_SPEEDUP_TIMER         = 706,
+  SI3218X_RAM_LCR_SPEEDUP_TIMER        = 707,
+  SI3218X_RAM_CM_SPEEDUP_TIMER         = 708,
+  SI3218X_RAM_VCM_TH                   = 709,
+  SI3218X_RAM_AC_SPEEDUP_TH            = 710,
+  SI3218X_RAM_SPR_SIG_0                = 711,
+  SI3218X_RAM_SPR_SIG_1                = 712,
+  SI3218X_RAM_SPR_SIG_2                = 713,
+  SI3218X_RAM_SPR_SIG_3                = 714,
+  SI3218X_RAM_SPR_SIG_4                = 715,
+  SI3218X_RAM_SPR_SIG_5                = 716,
+  SI3218X_RAM_SPR_SIG_6                = 717,
+  SI3218X_RAM_SPR_SIG_7                = 718,
+  SI3218X_RAM_SPR_SIG_8                = 719,
+  SI3218X_RAM_SPR_SIG_9                = 720,
+  SI3218X_RAM_SPR_SIG_10               = 721,
+  SI3218X_RAM_SPR_SIG_11               = 722,
+  SI3218X_RAM_SPR_SIG_12               = 723,
+  SI3218X_RAM_SPR_SIG_13               = 724,
+  SI3218X_RAM_SPR_SIG_14               = 725,
+  SI3218X_RAM_SPR_SIG_15               = 726,
+  SI3218X_RAM_SPR_SIG_16               = 727,
+  SI3218X_RAM_SPR_SIG_17               = 728,
+  SI3218X_RAM_SPR_SIG_18               = 729,
+  SI3218X_RAM_COUNTER_VTR_VAL          = 730,
+  SI3218X_RAM_CONST_028                = 731,
+  SI3218X_RAM_CONST_032                = 732,
+  SI3218X_RAM_CONST_038                = 733,
+  SI3218X_RAM_CONST_046                = 734,
+  SI3218X_RAM_COUNTER_IRING_VAL        = 735,
+  SI3218X_RAM_GAIN_RING                = 736,
+  SI3218X_RAM_RING_HYST                = 737,
+  SI3218X_RAM_COMP_Z                   = 738,
+  SI3218X_RAM_CONST_115                = 739,
+  SI3218X_RAM_CONST_110                = 740,
+  SI3218X_RAM_CONST_105                = 741,
+  SI3218X_RAM_CONST_100                = 742,
+  SI3218X_RAM_CONST_095                = 743,
+  SI3218X_RAM_CONST_090                = 744,
+  SI3218X_RAM_CONST_085                = 745,
+  SI3218X_RAM_V_RASUM_IDEAL            = 746,
+  SI3218X_RAM_CONST_ONE                = 747,
+  SI3218X_RAM_VCM_OH                   = 748,
+  SI3218X_RAM_VCM_RING                 = 749,
+  SI3218X_RAM_VCM_HYST                 = 750,
+  SI3218X_RAM_VOV_GND                  = 751,
+  SI3218X_RAM_VOV_BAT                  = 752,
+  SI3218X_RAM_VOV_RING_BAT             = 753,
+  SI3218X_RAM_CM_DBI                   = 754,
+  SI3218X_RAM_RTPER                    = 755,
+  SI3218X_RAM_P_TH_HVIC                = 756,
+  SI3218X_RAM_UNUSED757                = 757,
+  SI3218X_RAM_UNUSED758                = 758,
+  SI3218X_RAM_COEF_P_HVIC              = 759,
+  SI3218X_RAM_UNUSED760                = 760,
+  SI3218X_RAM_UNUSED761                = 761,
+  SI3218X_RAM_UNUSED762                = 762,
+  SI3218X_RAM_UNUSED763                = 763,
+  SI3218X_RAM_BAT_HYST                 = 764,
+  SI3218X_RAM_BAT_DBI                  = 765,
+  SI3218X_RAM_VBATL_EXPECT             = 766,
+  SI3218X_RAM_VBATH_EXPECT             = 767,
+  SI3218X_RAM_VBATR_EXPECT             = 768,
+  SI3218X_RAM_BAT_SETTLE               = 769,
+  SI3218X_RAM_VBAT_IRQ_TH              = 770,
+  SI3218X_RAM_MADC_VTIPC_OS            = 771,
+  SI3218X_RAM_MADC_VRINGC_OS           = 772,
+  SI3218X_RAM_MADC_VBAT_OS             = 773,
+  SI3218X_RAM_MADC_VLONG_OS            = 774,
+  SI3218X_RAM_UNUSED775                = 775,
+  SI3218X_RAM_MADC_VDC_OS              = 776,
+  SI3218X_RAM_MADC_ILONG_OS            = 777,
+  SI3218X_RAM_UNUSED778                = 778,
+  SI3218X_RAM_UNUSED779                = 779,
+  SI3218X_RAM_MADC_ILOOP_OS            = 780,
+  SI3218X_RAM_MADC_ILOOP_SCALE         = 781,
+  SI3218X_RAM_UNUSED782                = 782,
+  SI3218X_RAM_UNUSED783                = 783,
+  SI3218X_RAM_DC_ADC_OS                = 784,
+  SI3218X_RAM_CAL_UNITY                = 785,
+  SI3218X_RAM_UNUSED786                = 786,
+  SI3218X_RAM_UNUSED787                = 787,
+  SI3218X_RAM_ACADC_OFFSET             = 788,
+  SI3218X_RAM_ACDAC_OFFSET             = 789,
+  SI3218X_RAM_CAL_DCDAC_CODE           = 790,
+  SI3218X_RAM_CAL_DCDAC_15MA           = 791,
+  SI3218X_RAM_UNUSED792                = 792,
+  SI3218X_RAM_UNUSED793                = 793,
+  SI3218X_RAM_UNUSED794                = 794,
+  SI3218X_RAM_UNUSED795                = 795,
+  SI3218X_RAM_UNUSED796                = 796,
+  SI3218X_RAM_UNUSED797                = 797,
+  SI3218X_RAM_UNUSED798                = 798,
+  SI3218X_RAM_UNUSED799                = 799,
+  SI3218X_RAM_UNUSED800                = 800,
+  SI3218X_RAM_CAL_LB_TSQUELCH          = 801,
+  SI3218X_RAM_CAL_LB_TCHARGE           = 802,
+  SI3218X_RAM_CAL_LB_TSETTLE0          = 803,
+  SI3218X_RAM_CAL_GOERTZEL_DLY         = 804,
+  SI3218X_RAM_CAL_GOERTZEL_ALPHA       = 805,
+  SI3218X_RAM_CAL_DECLPF_K             = 806,
+  SI3218X_RAM_CAL_DECLPF_B1            = 807,
+  SI3218X_RAM_CAL_DECLPF_B2            = 808,
+  SI3218X_RAM_CAL_DECLPF_A1            = 809,
+  SI3218X_RAM_CAL_DECLPF_A2            = 810,
+  SI3218X_RAM_CAL_ACADC_THRL           = 811,
+  SI3218X_RAM_CAL_ACADC_THRH           = 812,
+  SI3218X_RAM_CAL_ACADC_TSETTLE        = 813,
+  SI3218X_RAM_DTROW0TH                 = 814,
+  SI3218X_RAM_DTROW1TH                 = 815,
+  SI3218X_RAM_DTROW2TH                 = 816,
+  SI3218X_RAM_DTROW3TH                 = 817,
+  SI3218X_RAM_DTCOL0TH                 = 818,
+  SI3218X_RAM_DTCOL1TH                 = 819,
+  SI3218X_RAM_DTCOL2TH                 = 820,
+  SI3218X_RAM_DTCOL3TH                 = 821,
+  SI3218X_RAM_DTFTWTH                  = 822,
+  SI3218X_RAM_DTRTWTH                  = 823,
+  SI3218X_RAM_DTROWRTH                 = 824,
+  SI3218X_RAM_DTCOLRTH                 = 825,
+  SI3218X_RAM_DTROW2HTH                = 826,
+  SI3218X_RAM_DTCOL2HTH                = 827,
+  SI3218X_RAM_DTMINPTH                 = 828,
+  SI3218X_RAM_DTHOTTH                  = 829,
+  SI3218X_RAM_RXPWR                    = 830,
+  SI3218X_RAM_TXPWR                    = 831,
+  SI3218X_RAM_RXMODPWR                 = 832,
+  SI3218X_RAM_TXMODPWR                 = 833,
+  SI3218X_RAM_FSKFREQ0                 = 834,
+  SI3218X_RAM_FSKFREQ1                 = 835,
+  SI3218X_RAM_FSKAMP0                  = 836,
+  SI3218X_RAM_FSKAMP1                  = 837,
+  SI3218X_RAM_FSK01                    = 838,
+  SI3218X_RAM_FSK10                    = 839,
+  SI3218X_RAM_VOCDELTA                 = 840,
+  SI3218X_RAM_VOCLTH                   = 841,
+  SI3218X_RAM_VOCHTH                   = 842,
+  SI3218X_RAM_RINGOF                   = 843,
+  SI3218X_RAM_RINGFR                   = 844,
+  SI3218X_RAM_RINGAMP                  = 845,
+  SI3218X_RAM_RINGPHAS                 = 846,
+  SI3218X_RAM_RTDCTH                   = 847,
+  SI3218X_RAM_RTACTH                   = 848,
+  SI3218X_RAM_RTDCDB                   = 849,
+  SI3218X_RAM_RTACDB                   = 850,
+  SI3218X_RAM_RTCOUNT                  = 851,
+  SI3218X_RAM_LCROFFHK                 = 852,
+  SI3218X_RAM_LCRONHK                  = 853,
+  SI3218X_RAM_LCRMASK                  = 854,
+  SI3218X_RAM_LCRMASK_POLREV           = 855,
+  SI3218X_RAM_LCRMASK_STATE            = 856,
+  SI3218X_RAM_LCRMASK_LINECAP          = 857,
+  SI3218X_RAM_LONGHITH                 = 858,
+  SI3218X_RAM_LONGLOTH                 = 859,
+  SI3218X_RAM_IRING_LIM                = 860,
+  SI3218X_RAM_AC_PU_DELTA1             = 861,
+  SI3218X_RAM_AC_PU_DELTA2             = 862,
+  SI3218X_RAM_DIAG_LPF_8K              = 863,
+  SI3218X_RAM_DIAG_LPF_128K            = 864,
+  SI3218X_RAM_DIAG_INV_N               = 865,
+  SI3218X_RAM_DIAG_GAIN                = 866,
+  SI3218X_RAM_DIAG_G_CAL               = 867,
+  SI3218X_RAM_DIAG_OS_CAL              = 868,
+  SI3218X_RAM_SPR_GAIN_TRIM            = 869,
+  SI3218X_RAM_UNUSED870                = 870,
+  SI3218X_RAM_AC_DAC_GAIN              = 871,
+  SI3218X_RAM_UNUSED872                = 872,
+  SI3218X_RAM_UNUSED873                = 873,
+  SI3218X_RAM_AC_DAC_GAIN0             = 874,
+  SI3218X_RAM_EZSYNTH_B0               = 875,
+  SI3218X_RAM_UNUSED876                = 876,
+  SI3218X_RAM_UNUSED877                = 877,
+  SI3218X_RAM_UNUSED878                = 878,
+  SI3218X_RAM_UNUSED879                = 879,
+  SI3218X_RAM_AC_ADC_GAIN              = 880,
+  SI3218X_RAM_ILOOP1LPF                = 881,
+  SI3218X_RAM_RING_FLUSH_TIMER         = 882,
+  SI3218X_RAM_ALAW_BIAS                = 883,
+  SI3218X_RAM_MADC_VTRC_SCALE          = 884,
+  SI3218X_RAM_UNUSED885                = 885,
+  SI3218X_RAM_MADC_VBAT_SCALE          = 886,
+  SI3218X_RAM_MADC_VLONG_SCALE         = 887,
+  SI3218X_RAM_MADC_VLONG_SCALE_RING    = 888,
+  SI3218X_RAM_UNUSED889                = 889,
+  SI3218X_RAM_MADC_VDC_SCALE           = 890,
+  SI3218X_RAM_MADC_ILONG_SCALE         = 891,
+  SI3218X_RAM_UNUSED892                = 892,
+  SI3218X_RAM_UNUSED893                = 893,
+  SI3218X_RAM_VDIFF_SENSE_SCALE        = 894,
+  SI3218X_RAM_VDIFF_SENSE_SCALE_RING   = 895,
+  SI3218X_RAM_VOV_RING_GND             = 896,
+  SI3218X_RAM_DIAG_GAIN_DC             = 897,
+  SI3218X_RAM_CAL_LB_OSC1_FREQ         = 898,
+  SI3218X_RAM_CAL_DCDAC_9TAU           = 899,
+  SI3218X_RAM_CAL_MADC_9TAU            = 900,
+  SI3218X_RAM_ADAP_RING_MIN_I          = 901,
+  SI3218X_RAM_SWEEP_STEP               = 902,
+  SI3218X_RAM_SWEEP_STEP_SAVE          = 903,
+  SI3218X_RAM_SWEEP_REF                = 904,
+  SI3218X_RAM_AMP_STEP                 = 905,
+  SI3218X_RAM_RXACGAIN_SAVE            = 906,
+  SI3218X_RAM_AMP_RAMP_INIT            = 907,
+  SI3218X_RAM_DIAG_HPF_GAIN            = 908,
+  SI3218X_RAM_DIAG_HPF_8K              = 909,
+  SI3218X_RAM_DIAG_ADJ_STEP            = 910,
+  SI3218X_RAM_UNUSED911                = 911,
+  SI3218X_RAM_UNUSED912                = 912,
+  SI3218X_RAM_MADC_SCALE_INV           = 913,
+  SI3218X_RAM_UNUSED914                = 914,
+  SI3218X_RAM_PWRSAVE_TIMER            = 915,
+  SI3218X_RAM_OFFHOOK_THRESH           = 916,
+  SI3218X_RAM_SPEEDUP_MASK_TIMER       = 917,
+  SI3218X_RAM_UNUSED918                = 918,
+  SI3218X_RAM_VBAT_TRACK_MIN           = 919,
+  SI3218X_RAM_VBAT_TRACK_MIN_RNG       = 920,
+  SI3218X_RAM_UNUSED921                = 921,
+  SI3218X_RAM_UNUSED922                = 922,
+  SI3218X_RAM_UNUSED923                = 923,
+  SI3218X_RAM_UNUSED924                = 924,
+  SI3218X_RAM_UNUSED925                = 925,
+  SI3218X_RAM_UNUSED926                = 926,
+  SI3218X_RAM_DC_HOLD_DAC_OS           = 927,
+  SI3218X_RAM_UNUSED928                = 928,
+  SI3218X_RAM_NOTCH_B0                 = 929,
+  SI3218X_RAM_NOTCH_B1                 = 930,
+  SI3218X_RAM_NOTCH_B2                 = 931,
+  SI3218X_RAM_NOTCH_A1                 = 932,
+  SI3218X_RAM_NOTCH_A2                 = 933,
+  SI3218X_RAM_METER_LPF_B0             = 934,
+  SI3218X_RAM_METER_LPF_B1             = 935,
+  SI3218X_RAM_METER_LPF_B2             = 936,
+  SI3218X_RAM_METER_LPF_A1             = 937,
+  SI3218X_RAM_METER_LPF_A2             = 938,
+  SI3218X_RAM_METER_SIG_0              = 939,
+  SI3218X_RAM_METER_SIG_1              = 940,
+  SI3218X_RAM_METER_SIG_2              = 941,
+  SI3218X_RAM_METER_SIG_3              = 942,
+  SI3218X_RAM_METER_SIG_4              = 943,
+  SI3218X_RAM_METER_SIG_5              = 944,
+  SI3218X_RAM_METER_SIG_6              = 945,
+  SI3218X_RAM_METER_SIG_7              = 946,
+  SI3218X_RAM_METER_SIG_8              = 947,
+  SI3218X_RAM_METER_SIG_9              = 948,
+  SI3218X_RAM_METER_SIG_10             = 949,
+  SI3218X_RAM_METER_SIG_11             = 950,
+  SI3218X_RAM_METER_SIG_12             = 951,
+  SI3218X_RAM_METER_SIG_13             = 952,
+  SI3218X_RAM_METER_SIG_14             = 953,
+  SI3218X_RAM_METER_SIG_15             = 954,
+  SI3218X_RAM_METER_BP_B0              = 955,
+  SI3218X_RAM_METER_BP_B1              = 956,
+  SI3218X_RAM_METER_BP_B2              = 957,
+  SI3218X_RAM_METER_BP_A1              = 958,
+  SI3218X_RAM_METER_BP_A2              = 959,
+  SI3218X_RAM_PM_AMP_THRESH            = 960,
+  SI3218X_RAM_METER_GAIN               = 961,
+  SI3218X_RAM_PWRSAVE_DBI              = 962,
+  SI3218X_RAM_DCDC_ANA_SCALE           = 963,
+  SI3218X_RAM_VOV_BAT_PWRSAVE_LO       = 964,
+  SI3218X_RAM_VOV_BAT_PWRSAVE_HI       = 965,
+  SI3218X_RAM_AC_ADC_GAIN0             = 966,
+  SI3218X_RAM_SCALE_KAUDIO             = 967,
+  SI3218X_RAM_METER_GAIN_TEMP          = 968,
+  SI3218X_RAM_METER_RAMP_STEP          = 969,
+  SI3218X_RAM_THERM_DBI                = 970,
+  SI3218X_RAM_LPR_SCALE                = 971,
+  SI3218X_RAM_LPR_CM_OS                = 972,
+  SI3218X_RAM_VOV_DCDC_SLOPE           = 973,
+  SI3218X_RAM_VOV_DCDC_OS              = 974,
+  SI3218X_RAM_VOV_RING_BAT_MAX         = 975,
+  SI3218X_RAM_SLOPE_VLIM1              = 976,
+  SI3218X_RAM_SLOPE_RFEED1             = 977,
+  SI3218X_RAM_SLOPE_ILIM1              = 978,
+  SI3218X_RAM_V_VLIM1                  = 979,
+  SI3218X_RAM_V_RFEED1                 = 980,
+  SI3218X_RAM_V_ILIM1                  = 981,
+  SI3218X_RAM_CONST_RFEED1             = 982,
+  SI3218X_RAM_CONST_ILIM1              = 983,
+  SI3218X_RAM_I_VLIM1                  = 984,
+  SI3218X_RAM_SLOPE_VLIM2              = 985,
+  SI3218X_RAM_SLOPE_RFEED2             = 986,
+  SI3218X_RAM_SLOPE_ILIM2              = 987,
+  SI3218X_RAM_V_VLIM2                  = 988,
+  SI3218X_RAM_V_RFEED2                 = 989,
+  SI3218X_RAM_V_ILIM2                  = 990,
+  SI3218X_RAM_CONST_RFEED2             = 991,
+  SI3218X_RAM_CONST_ILIM2              = 992,
+  SI3218X_RAM_I_VLIM2                  = 993,
+  SI3218X_RAM_DIAG_V_TAR               = 994,
+  SI3218X_RAM_DIAG_V_TAR2              = 995,
+  SI3218X_RAM_STOP_TIMER1_VAL          = 996,
+  SI3218X_RAM_STOP_TIMER2_VAL          = 997,
+  SI3218X_RAM_DIAG_VCM1_TAR            = 998,
+  SI3218X_RAM_DIAG_VCM_STEP            = 999,
+  SI3218X_RAM_LKG_DNT_HIRES            = 1000,
+  SI3218X_RAM_LKG_DNR_HIRES            = 1001,
+  SI3218X_RAM_LINEAR_OS                = 1002,
+  SI3218X_RAM_CPUMP_DEB                = 1003,
+  SI3218X_RAM_DCDC_VERR                = 1004,
+  SI3218X_RAM_DCDC_VERR_HYST           = 1005,
+  SI3218X_RAM_DCDC_OITHRESH_LO         = 1006,
+  SI3218X_RAM_DCDC_OITHRESH_HI         = 1007,
+  SI3218X_RAM_HV_BIAS_ONHK             = 1008,
+  SI3218X_RAM_HV_BIAS_OFFHK            = 1009,
+  SI3218X_RAM_UNUSED1010               = 1010,
+  SI3218X_RAM_UNUSED1011               = 1011,
+  SI3218X_RAM_UNUSED1012               = 1012,
+  SI3218X_RAM_UNUSED1013               = 1013,
+  SI3218X_RAM_ILONG_RT_THRESH          = 1014,
+  SI3218X_RAM_VOV_RING_BAT_DCDC        = 1015,
+  SI3218X_RAM_UNUSED1016               = 1016,
+  SI3218X_RAM_LKG_LB_OFFSET            = 1017,
+  SI3218X_RAM_LKG_OFHK_OFFSET          = 1018,
+  SI3218X_RAM_SWEEP_FREQ_TH            = 1019,
+  SI3218X_RAM_AMP_MOD_G                = 1020,
+  SI3218X_RAM_AMP_MOD_OS               = 1021,
+  SI3218X_RAM_UNUSED1022               = 1022,
+  SI3218X_RAM_UNUSED1023               = 1023,
+  SI3218X_RAM_UNUSED_REG256            = 1280,
+  SI3218X_RAM_DAC_IN                   = 1281,
+  SI3218X_RAM_ADC_OUT                  = 1282,
+  SI3218X_RAM_PASS1                    = 1283,
+  SI3218X_RAM_TX_AC_INT                = 1284,
+  SI3218X_RAM_RX_AC_DIFF               = 1285,
+  SI3218X_RAM_INDIRECT_WR              = 1286,
+  SI3218X_RAM_INDIRECT_RD              = 1287,
+  SI3218X_RAM_BYPASS_OUT               = 1288,
+  SI3218X_RAM_ACC                      = 1289,
+  SI3218X_RAM_INDIRECT_RAM_A           = 1290,
+  SI3218X_RAM_INDIRECT_RAM_B           = 1291,
+  SI3218X_RAM_HOT_BIT1                 = 1292,
+  SI3218X_RAM_HOT_BIT0                 = 1293,
+  SI3218X_RAM_PASS0_ROW_PWR            = 1294,
+  SI3218X_RAM_PASS0_COL_PWR            = 1295,
+  SI3218X_RAM_PASS0_ROW                = 1296,
+  SI3218X_RAM_PASS0_COL                = 1297,
+  SI3218X_RAM_PASS0_ROW_REL            = 1298,
+  SI3218X_RAM_PASS0_COL_REL            = 1299,
+  SI3218X_RAM_PASS0_ROW_2ND            = 1300,
+  SI3218X_RAM_PASS0_COL_2ND            = 1301,
+  SI3218X_RAM_PASS0_REV_TW             = 1302,
+  SI3218X_RAM_PASS0_FWD_TW             = 1303,
+  SI3218X_RAM_DAA_ADC_OUT              = 1304,
+  SI3218X_RAM_CAL_CM_BAL_TEST          = 1305,
+  SI3218X_RAM_UNUSED_REG282            = 1306,
+  SI3218X_RAM_TONE1                    = 1307,
+  SI3218X_RAM_TONE2                    = 1308,
+  SI3218X_RAM_RING_TRIG                = 1309,
+  SI3218X_RAM_VCM_DAC                  = 1310,
+  SI3218X_RAM_UNUSED_REG287            = 1311,
+  SI3218X_RAM_RING_DAC                 = 1312,
+  SI3218X_RAM_VRING_CROSSING           = 1313,
+  SI3218X_RAM_UNUSED_REG290            = 1314,
+  SI3218X_RAM_LINEFEED_SHADOW          = 1315,
+  SI3218X_RAM_UNUSED_REG292            = 1316,
+  SI3218X_RAM_UNUSED_REG293            = 1317,
+  SI3218X_RAM_UNUSED_REG294            = 1318,
+  SI3218X_RAM_ROW_DIGIT                = 1319,
+  SI3218X_RAM_COL_DIGIT                = 1320,
+  SI3218X_RAM_UNUSED_REG297            = 1321,
+  SI3218X_RAM_PQ1_IRQ                  = 1322,
+  SI3218X_RAM_PQ2_IRQ                  = 1323,
+  SI3218X_RAM_PQ3_IRQ                  = 1324,
+  SI3218X_RAM_PQ4_IRQ                  = 1325,
+  SI3218X_RAM_PQ5_IRQ                  = 1326,
+  SI3218X_RAM_PQ6_IRQ                  = 1327,
+  SI3218X_RAM_LCR_SET                  = 1328,
+  SI3218X_RAM_LCR_CLR                  = 1329,
+  SI3218X_RAM_RTP_SET                  = 1330,
+  SI3218X_RAM_LONG_SET                 = 1331,
+  SI3218X_RAM_LONG_CLR                 = 1332,
+  SI3218X_RAM_VDIFF_IRQ                = 1333,
+  SI3218X_RAM_MODFEED_SET              = 1334,
+  SI3218X_RAM_MODFEED_CLR              = 1335,
+  SI3218X_RAM_LF_SPEEDUP_SET           = 1336,
+  SI3218X_RAM_LF_SPEEDUP_CLR           = 1337,
+  SI3218X_RAM_DC_SPEEDUP_SET           = 1338,
+  SI3218X_RAM_DC_SPEEDUP_CLR           = 1339,
+  SI3218X_RAM_AC_SPEEDUP_SET           = 1340,
+  SI3218X_RAM_AC_SPEEDUP_CLR           = 1341,
+  SI3218X_RAM_LCR_SPEEDUP_SET          = 1342,
+  SI3218X_RAM_LCR_SPEEDUP_CLR          = 1343,
+  SI3218X_RAM_CM_SPEEDUP_SET           = 1344,
+  SI3218X_RAM_CM_SPEEDUP_CLR           = 1345,
+  SI3218X_RAM_MODEMPASS0               = 1346,
+  SI3218X_RAM_RX2100_PASS1_PWR         = 1347,
+  SI3218X_RAM_RX2100_PASS1_THR         = 1348,
+  SI3218X_RAM_TX2100_PASS1_PWR         = 1349,
+  SI3218X_RAM_TX2100_PASS1_THR         = 1350,
+  SI3218X_RAM_TXMDM_TRIG               = 1351,
+  SI3218X_RAM_RXMDM_TRIG               = 1352,
+  SI3218X_RAM_UNUSED_REG329            = 1353,
+  SI3218X_RAM_TX_FILT_CLR              = 1354,
+  SI3218X_RAM_TX_DC_INT                = 1355,
+  SI3218X_RAM_RX_DC_MOD_IN             = 1356,
+  SI3218X_RAM_DSP_ACCESS               = 1357,
+  SI3218X_RAM_PRAM_ADDR                = 1358,
+  SI3218X_RAM_PRAM_DATA                = 1359,
+  SI3218X_RAM_IND_RAM_A_BASE           = 1360,
+  SI3218X_RAM_IND_RAM_A_ADDR           = 1361,
+  SI3218X_RAM_IND_RAM_A_MOD            = 1362,
+  SI3218X_RAM_IND_RAM_B_BASE           = 1363,
+  SI3218X_RAM_IND_RAM_B_ADDR           = 1364,
+  SI3218X_RAM_IND_RAM_B_MOD            = 1365,
+  SI3218X_RAM_UNUSED_REG342            = 1366,
+  SI3218X_RAM_UNUSED_REG343            = 1367,
+  SI3218X_RAM_UNUSED_REG344            = 1368,
+  SI3218X_RAM_USER_B0                  = 1369,
+  SI3218X_RAM_USER_B1                  = 1370,
+  SI3218X_RAM_USER_B2                  = 1371,
+  SI3218X_RAM_USER_B3                  = 1372,
+  SI3218X_RAM_USER_B4                  = 1373,
+  SI3218X_RAM_USER_B5                  = 1374,
+  SI3218X_RAM_USER_B6                  = 1375,
+  SI3218X_RAM_USER_B7                  = 1376,
+  SI3218X_RAM_FLUSH_AUDIO_CLR          = 1377,
+  SI3218X_RAM_FLUSH_DC_CLR             = 1378,
+  SI3218X_RAM_SPR_CLR                  = 1379,
+  SI3218X_RAM_GPI0                     = 1380,
+  SI3218X_RAM_GPI1                     = 1381,
+  SI3218X_RAM_GPI2                     = 1382,
+  SI3218X_RAM_GPI3                     = 1383,
+  SI3218X_RAM_GPO0                     = 1384,
+  SI3218X_RAM_GPO1                     = 1385,
+  SI3218X_RAM_GPO2                     = 1386,
+  SI3218X_RAM_GPO3                     = 1387,
+  SI3218X_RAM_GPO0_OE                  = 1388,
+  SI3218X_RAM_GPO1_OE                  = 1389,
+  SI3218X_RAM_GPO2_OE                  = 1390,
+  SI3218X_RAM_GPO3_OE                  = 1391,
+  SI3218X_RAM_BATSEL_L_SET             = 1392,
+  SI3218X_RAM_BATSEL_H_SET             = 1393,
+  SI3218X_RAM_BATSEL_R_SET             = 1394,
+  SI3218X_RAM_BATSEL_CLR               = 1395,
+  SI3218X_RAM_VBAT_IRQ                 = 1396,
+  SI3218X_RAM_MADC_VTIPC_RAW           = 1397,
+  SI3218X_RAM_MADC_VRINGC_RAW          = 1398,
+  SI3218X_RAM_MADC_VBAT_RAW            = 1399,
+  SI3218X_RAM_MADC_VLONG_RAW           = 1400,
+  SI3218X_RAM_UNUSED_REG377            = 1401,
+  SI3218X_RAM_MADC_VDC_RAW             = 1402,
+  SI3218X_RAM_MADC_ILONG_RAW           = 1403,
+  SI3218X_RAM_UNUSED_REG380            = 1404,
+  SI3218X_RAM_UNUSED_REG381            = 1405,
+  SI3218X_RAM_MADC_ILOOP_RAW           = 1406,
+  SI3218X_RAM_MADC_DIAG_RAW            = 1407,
+  SI3218X_RAM_UNUSED_REG384            = 1408,
+  SI3218X_RAM_UNUSED_REG385            = 1409,
+  SI3218X_RAM_CALR3_DSP                = 1410,
+  SI3218X_RAM_PD_MADC                  = 1411,
+  SI3218X_RAM_UNUSED_REG388            = 1412,
+  SI3218X_RAM_PD_BIAS                  = 1413,
+  SI3218X_RAM_PD_DC_ADC                = 1414,
+  SI3218X_RAM_PD_DC_DAC                = 1415,
+  SI3218X_RAM_PD_DC_SNS                = 1416,
+  SI3218X_RAM_PD_DC_COARSE_SNS         = 1417,
+  SI3218X_RAM_PD_VBAT_SNS              = 1418,
+  SI3218X_RAM_PD_DC_BUF                = 1419,
+  SI3218X_RAM_PD_AC_ADC                = 1420,
+  SI3218X_RAM_PD_AC_DAC                = 1421,
+  SI3218X_RAM_PD_AC_SNS                = 1422,
+  SI3218X_RAM_PD_CM_SNS                = 1423,
+  SI3218X_RAM_PD_CM                    = 1424,
+  SI3218X_RAM_UNUSED_REG401            = 1425,
+  SI3218X_RAM_UNUSED_REG402            = 1426,
+  SI3218X_RAM_PD_SUM                   = 1427,
+  SI3218X_RAM_PD_LKGDAC                = 1428,
+  SI3218X_RAM_UNUSED_REG405            = 1429,
+  SI3218X_RAM_PD_HVIC                  = 1430,
+  SI3218X_RAM_UNUSED_REG407            = 1431,
+  SI3218X_RAM_CMDAC_CHEN_B             = 1432,
+  SI3218X_RAM_SUM_CHEN_B               = 1433,
+  SI3218X_RAM_TRNRD_CHEN_B             = 1434,
+  SI3218X_RAM_UNUSED_REG411            = 1435,
+  SI3218X_RAM_DC_BUF_CHEN_B            = 1436,
+  SI3218X_RAM_AC_SNS_CHEN_B            = 1437,
+  SI3218X_RAM_DC_SNS_CHEN_B            = 1438,
+  SI3218X_RAM_LB_MUX_CHEN_B            = 1439,
+  SI3218X_RAM_UNUSED_REG416            = 1440,
+  SI3218X_RAM_CMDAC_EN_B               = 1441,
+  SI3218X_RAM_RA_EN_B                  = 1442,
+  SI3218X_RAM_RD_EN_B                  = 1443,
+  SI3218X_RAM_VCTL                     = 1444,
+  SI3218X_RAM_UNUSED_REG421            = 1445,
+  SI3218X_RAM_UNUSED_REG422            = 1446,
+  SI3218X_RAM_HVIC_STATE               = 1447,
+  SI3218X_RAM_HVIC_STATE_OBSERVE       = 1448,
+  SI3218X_RAM_HVIC_STATE_MAN           = 1449,
+  SI3218X_RAM_HVIC_STATE_READ          = 1450,
+  SI3218X_RAM_UNUSED_REG427            = 1451,
+  SI3218X_RAM_VCMDAC_SCALE_MAN         = 1452,
+  SI3218X_RAM_CAL_ACADC_CNTL           = 1453,
+  SI3218X_RAM_CAL_ACDAC_CNTL           = 1454,
+  SI3218X_RAM_UNUSED_REG431            = 1455,
+  SI3218X_RAM_CAL_DCDAC_CNTL           = 1456,
+  SI3218X_RAM_CAL_TRNRD_CNTL           = 1457,
+  SI3218X_RAM_CAL_TRNRD_DACT           = 1458,
+  SI3218X_RAM_CAL_TRNRD_DACR           = 1459,
+  SI3218X_RAM_LKG_UPT_ACTIVE           = 1460,
+  SI3218X_RAM_LKG_UPR_ACTIVE           = 1461,
+  SI3218X_RAM_LKG_DNT_ACTIVE           = 1462,
+  SI3218X_RAM_LKG_DNR_ACTIVE           = 1463,
+  SI3218X_RAM_LKG_UPT_OHT              = 1464,
+  SI3218X_RAM_LKG_UPR_OHT              = 1465,
+  SI3218X_RAM_LKG_DNT_OHT              = 1466,
+  SI3218X_RAM_LKG_DNR_OHT              = 1467,
+  SI3218X_RAM_CAL_LKG_EN_CNTL          = 1468,
+  SI3218X_RAM_CAL_PUPD_CNTL            = 1469,
+  SI3218X_RAM_UNUSED_REG446            = 1470,
+  SI3218X_RAM_CAL_AC_RCAL              = 1471,
+  SI3218X_RAM_CAL_DC_RCAL              = 1472,
+  SI3218X_RAM_KAC_MOD                  = 1473,
+  SI3218X_RAM_KAC_SEL                  = 1474,
+  SI3218X_RAM_SEL_RING                 = 1475,
+  SI3218X_RAM_CMDAC_FWD                = 1476,
+  SI3218X_RAM_CMDAC_RVS                = 1477,
+  SI3218X_RAM_CAL_INC_STATE            = 1478,
+  SI3218X_RAM_CAL_DCDAC_COMP           = 1479,
+  SI3218X_RAM_BAT_SWITCH               = 1480,
+  SI3218X_RAM_CH_IRQ                   = 1481,
+  SI3218X_RAM_ILOOP_CROSSING           = 1482,
+  SI3218X_RAM_VOC_FAILSAFE             = 1483,
+  SI3218X_RAM_UNUSED_REG460            = 1484,
+  SI3218X_RAM_UNUSED_REG461            = 1485,
+  SI3218X_RAM_GENERIC_0                = 1486,
+  SI3218X_RAM_GENERIC_1                = 1487,
+  SI3218X_RAM_GENERIC_2                = 1488,
+  SI3218X_RAM_GENERIC_3                = 1489,
+  SI3218X_RAM_GENERIC_4                = 1490,
+  SI3218X_RAM_GENERIC_5                = 1491,
+  SI3218X_RAM_GENERIC_6                = 1492,
+  SI3218X_RAM_GENERIC_7                = 1493,
+  SI3218X_RAM_UNUSED_REG470            = 1494,
+  SI3218X_RAM_UNUSED_REG471            = 1495,
+  SI3218X_RAM_QHI_SET                  = 1496,
+  SI3218X_RAM_QHI_CLR                  = 1497,
+  SI3218X_RAM_UNUSED_REG474            = 1498,
+  SI3218X_RAM_RDC_SUM                  = 1499,
+  SI3218X_RAM_UNUSED_REG476            = 1500,
+  SI3218X_RAM_UNUSED_REG477            = 1501,
+  SI3218X_RAM_UNUSED_REG478            = 1502,
+  SI3218X_RAM_UNUSED_REG479            = 1503,
+  SI3218X_RAM_UNUSED_REG480            = 1504,
+  SI3218X_RAM_UNUSED_REG481            = 1505,
+  SI3218X_RAM_FLUSH_AUDIO_MAN          = 1506,
+  SI3218X_RAM_FLUSH_DC_MAN             = 1507,
+  SI3218X_RAM_TIP_RING_CNTL            = 1508,
+  SI3218X_RAM_SQUELCH_SET              = 1509,
+  SI3218X_RAM_SQUELCH_CLR              = 1510,
+  SI3218X_RAM_CAL_STATE_MAN            = 1511,
+  SI3218X_RAM_UNUSED_REG488            = 1512,
+  SI3218X_RAM_UNUSED_REG489            = 1513,
+  SI3218X_RAM_RINGING_BW               = 1514,
+  SI3218X_RAM_AUDIO_MAN                = 1515,
+  SI3218X_RAM_HVIC_STATE_SPARE         = 1516,
+  SI3218X_RAM_RINGING_FAST_MAN         = 1517,
+  SI3218X_RAM_VCM_DAC_MAN              = 1518,
+  SI3218X_RAM_UNUSED_REG495            = 1519,
+  SI3218X_RAM_UNUSED_REG496            = 1520,
+  SI3218X_RAM_UNUSED_REG497            = 1521,
+  SI3218X_RAM_GENERIC_8                = 1522,
+  SI3218X_RAM_GENERIC_9                = 1523,
+  SI3218X_RAM_GENERIC_10               = 1524,
+  SI3218X_RAM_GENERIC_11               = 1525,
+  SI3218X_RAM_UNUSED_REG502            = 1526,
+  SI3218X_RAM_GENERIC_12               = 1527,
+  SI3218X_RAM_GENERIC_13               = 1528,
+  SI3218X_RAM_UNUSED_REG505            = 1529,
+  SI3218X_RAM_DC_HOLD_DAC              = 1530,
+  SI3218X_RAM_OFFHOOK_CMP              = 1531,
+  SI3218X_RAM_PWRSAVE_SET              = 1532,
+  SI3218X_RAM_PWRSAVE_CLR              = 1533,
+  SI3218X_RAM_PD_WKUP                  = 1534,
+  SI3218X_RAM_SPEEDUP_MASK_SET         = 1535,
+  SI3218X_RAM_SPEEDUP_MASK_CLR         = 1536,
+  SI3218X_RAM_UNUSED_REG513            = 1537,
+  SI3218X_RAM_PD_DCDC                  = 1538,
+  SI3218X_RAM_UNUSED_REG515            = 1539,
+  SI3218X_RAM_PD_UVLO                  = 1540,
+  SI3218X_RAM_PD_OVLO                  = 1541,
+  SI3218X_RAM_PD_OCLO                  = 1542,
+  SI3218X_RAM_PD_SWDRV                 = 1543,
+  SI3218X_RAM_UNUSED_REG520            = 1544,
+  SI3218X_RAM_DCDC_UVHYST              = 1545,
+  SI3218X_RAM_DCDC_UVTHRESH            = 1546,
+  SI3218X_RAM_DCDC_OVTHRESH            = 1547,
+  SI3218X_RAM_DCDC_OITHRESH            = 1548,
+  SI3218X_RAM_UNUSED_REG525            = 1549,
+  SI3218X_RAM_UNUSED_REG526            = 1550,
+  SI3218X_RAM_DCDC_STATUS              = 1551,
+  SI3218X_RAM_UNUSED_REG528            = 1552,
+  SI3218X_RAM_DCDC_SWDRV_POL           = 1553,
+  SI3218X_RAM_DCDC_UVPOL               = 1554,
+  SI3218X_RAM_DCDC_CPUMP               = 1555,
+  SI3218X_RAM_UNUSED_REG532            = 1556,
+  SI3218X_RAM_DCDC_VREF_MAN            = 1557,
+  SI3218X_RAM_DCDC_VREF_CTRL           = 1558,
+  SI3218X_RAM_UNUSED_REG535            = 1559,
+  SI3218X_RAM_DCDC_RNGTYPE             = 1560,
+  SI3218X_RAM_DCDC_DIN_FILT            = 1561,
+  SI3218X_RAM_UNUSED_REG538            = 1562,
+  SI3218X_RAM_DCDC_DOUT                = 1563,
+  SI3218X_RAM_UNUSED_REG540            = 1564,
+  SI3218X_RAM_DCDC_OIMASK              = 1565,
+  SI3218X_RAM_UNUSED_REG542            = 1566,
+  SI3218X_RAM_UNUSED_REG543            = 1567,
+  SI3218X_RAM_DCDC_SC_SET              = 1568,
+  SI3218X_RAM_WAKE_HOLD                = 1569,
+  SI3218X_RAM_PD_AC_SQUELCH            = 1570,
+  SI3218X_RAM_PD_REF_OSC               = 1571,
+  SI3218X_RAM_UNUSED_REG548            = 1572,
+  SI3218X_RAM_PWRSAVE_MAN              = 1573,
+  SI3218X_RAM_PWRSAVE_SEL              = 1574,
+  SI3218X_RAM_PWRSAVE_CTRL_LO          = 1575,
+  SI3218X_RAM_PWRSAVE_CTRL_HI          = 1576,
+  SI3218X_RAM_PWRSAVE_HVIC_LO          = 1577,
+  SI3218X_RAM_PWRSAVE_HVIC_HI          = 1578,
+  SI3218X_RAM_DSP_PROM_MISR            = 1579,
+  SI3218X_RAM_DSP_CROM_MISR            = 1580,
+  SI3218X_RAM_DAA_PROM_MISR            = 1581,
+  SI3218X_RAM_DAA_CROM_MISR            = 1582,
+  SI3218X_RAM_RAMBIST_ERROR            = 1583,
+  SI3218X_RAM_DCDC_ANA_VREF            = 1584,
+  SI3218X_RAM_DCDC_ANA_GAIN            = 1585,
+  SI3218X_RAM_DCDC_ANA_TOFF            = 1586,
+  SI3218X_RAM_DCDC_ANA_TONMIN          = 1587,
+  SI3218X_RAM_DCDC_ANA_TONMAX          = 1588,
+  SI3218X_RAM_DCDC_ANA_DSHIFT          = 1589,
+  SI3218X_RAM_DCDC_ANA_LPOLY           = 1590,
+  SI3218X_RAM_DCDC_ANA_PSKIP           = 1591,
+  SI3218X_RAM_PD_DCDC_ANA              = 1592,
+  SI3218X_RAM_UNUSED_REG569            = 1593,
+  SI3218X_RAM_UNUSED_REG570            = 1594,
+  SI3218X_RAM_PWRPEND_SET              = 1595,
+  SI3218X_RAM_PD_CM_BUF                = 1596,
+  SI3218X_RAM_JMP8                     = 1597,
+  SI3218X_RAM_JMP9                     = 1598,
+  SI3218X_RAM_JMP10                    = 1599,
+  SI3218X_RAM_JMP11                    = 1600,
+  SI3218X_RAM_JMP12                    = 1601,
+  SI3218X_RAM_JMP13                    = 1602,
+  SI3218X_RAM_JMP14                    = 1603,
+  SI3218X_RAM_JMP15                    = 1604,
+  SI3218X_RAM_METER_TRIG               = 1605,
+  SI3218X_RAM_PM_ACTIVE                = 1606,
+  SI3218X_RAM_PM_INACTIVE              = 1607,
+  SI3218X_RAM_HVIC_VERSION             = 1608,
+  SI3218X_RAM_THERM_OFF                = 1609,
+  SI3218X_RAM_THERM_HI                 = 1610,
+  SI3218X_RAM_TEST_LOAD                = 1611,
+  SI3218X_RAM_DC_HOLD_MAN              = 1612,
+  SI3218X_RAM_DC_HOLD_DAC_MAN          = 1613,
+  SI3218X_RAM_UNUSED_REG590            = 1614,
+  SI3218X_RAM_DCDC_CPUMP_LP            = 1615,
+  SI3218X_RAM_DCDC_CPUMP_LP_MASK       = 1616,
+  SI3218X_RAM_DCDC_CPUMP_PULLDOWN      = 1617,
+  SI3218X_RAM_BOND_STATUS              = 1618,
+  SI3218X_RAM_BOND_MAN                 = 1619,
+  SI3218X_RAM_BOND_VAL                 = 1620,
+  SI3218X_RAM_REF_DEBOUNCE_PCLK        = 1633,
+  SI3218X_RAM_REF_DEBOUNCE_FSYNC       = 1634,
+  SI3218X_RAM_DCDC_LIFT_EN             = 1635,
+  SI3218X_RAM_DCDC_CPUMP_PGOOD         = 1636,
+  SI3218X_RAM_DCDC_CPUMP_PGOOD_WKEN    = 1637,
+  SI3218X_RAM_DCDC_CPUMP_PGOOD_FRC     = 1638,
+  SI3218X_RAM_DCDC_CPUMP_LP_MASK_SH    = 1639,
+  SI3218X_RAM_DCDC_UV_MAN              = 1640,
+  SI3218X_RAM_DCDC_UV_DEBOUNCE         = 1641,
+  SI3218X_RAM_DCDC_OV_MAN              = 1642,
+  SI3218X_RAM_DCDC_OV_DEBOUNCE         = 1643,
+  SI3218X_RAM_ANALOG3_TEST_MUX         = 1644,
+};
+
+#endif
+
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/inc/si_voice.h b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/inc/si_voice.h
new file mode 100644
index 0000000..fe03c58
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/inc/si_voice.h
@@ -0,0 +1,949 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Author(s):
+ * laj
+ *
+ * Distributed by:
+ * Silicon Laboratories, Inc
+ *
+ * This file contains proprietary information.
+ * No dissemination allowed without prior written permission from
+ * Silicon Laboratories, Inc.
+ *
+ * File Description:
+ * This is the main header file for the ProSLIC API software.
+ *
+ *
+ */
+
+#ifndef SI_VOICE_H
+#define SI_VOICE_H
+
+#include "../config_inc/proslic_api_config.h"
+#include "si_voice_ctrl.h"
+#include "si_voice_timer_intf.h"
+
+/* The following macros are in place so that if the customer did not define them, the "safe" default is not disable the functionality.*/
+#ifndef ENABLE_DEBUG
+#define DEBUG_PRINT(...)
+#define DEBUG_ENABLED(X) 0
+#endif
+
+#ifndef ENABLE_TRACES
+#define TRACE_ENABLED(X) 0
+#define TRACEPRINT(...)
+#define TRACEPRINT_NOCHAN(...)
+#endif
+
+#ifndef LOGPRINT
+#define LOGPRINT(...)
+#endif
+
+#define SILABS_UNREFERENCED_PARAMETER(param) (void)param
+
+/** @defgroup SIVOICE SiVoice definitions
+
+ * @{
+ */
+/*****************************************************************************/
+/** @defgroup CHIPFAM Chip family definitions
+ * @{
+ */
+#define SI3217X_TYPE 4   /**< Single channel chipset*/
+#define SI3226X_TYPE 5   /**< Dual channel chipset */
+#define SI3218X_TYPE 6   /**< Single channel chipset*/
+#define SI3228X_TYPE 7   /**< Dual channel chipset */
+#define SI3228X_TYPE 7   /**< Dual channel chipset */
+#define SI3219X_TYPE 8   /**< Single channel chipset*/
+#define SI3050_TYPE 20   /**< Single channel FXO chipset */
+
+/** @} CHIPFAM */
+/*****************************************************************************/
+
+
+/*
+* Workaroud for building on windows systems
+*/
+
+#ifdef RC_NONE
+#undef RC_NONE
+#endif
+
+#define SIVOICE_RC_NONE RC_NONE
+
+/**
+* This is the main Silicon Labs control interface object. do not access directly!
+*/
+typedef struct
+{
+  void *hCtrl;                                /**< user provided SPI/GCI structure */
+  ctrl_Reset_fptr Reset_fptr;                 /**< user provided reset function */
+  ctrl_WriteRegister_fptr
+  WriteRegister_fptr; /**< user provided SPI/GCI write register function */
+  ctrl_ReadRegister_fptr
+  ReadRegister_fptr;   /**< user provided SPI/GI read register function */
+  ctrl_WriteRAM_fptr
+  WriteRAM_fptr;           /**< ProSLIC only - user provided SPI/GCI read RAM/Indirect register function */
+  ctrl_ReadRAM_fptr ReadRAM_fptr;             /**< ProSLIC only */
+  ctrl_Semaphore_fptr Semaphore_fptr;         /**< ProSLIC only */
+  void *hTimer;                               /**< user provided Timer data structure */
+  system_delay_fptr
+  Delay_fptr;               /**< user supplied mSec delay function */
+  system_timeElapsed_fptr
+  timeElapsed_fptr;   /**< user provided mSec time elapsed function */
+  system_getTime_fptr
+  getTime_fptr;           /**< user provided timestamp function */
+} SiVoiceControlInterfaceType;
+
+/* MAINTAINER NOTE: if this changes, update deubg.c in the API demo */
+typedef enum
+{
+  SI32171, /* '170 is the HV version of this part */
+  SI32172, /* '173 is the HV version of this part */
+  SI32174,
+  SI32175,
+  SI32176,
+  SI32177,
+  SI32178,
+  SI32179,
+  SI32260,
+  SI32261,
+  SI32262,
+  SI32263,
+  SI32264,
+  SI32265,
+  SI32266,
+  SI32267,
+  SI32268,
+  SI32269,
+  SI32360,
+  SI32361,
+  SI32180,
+  SI32181,
+  SI32182,
+  SI32183,
+  SI32184,
+  SI32185,
+  SI32186,
+  SI32187,
+  SI32188,
+  SI32189, /* Place holder */
+  SI32280,
+  SI32281,
+  SI32282,
+  SI32283,
+  SI32284,
+  SI32285,
+  SI32286,
+  SI32287,
+  SI32289, /* Place holder */
+  SI32190, /* NOT all parts numbers are used at this time and are placeholders */
+  SI32191,
+  SI32192,
+  SI32193,
+  SI32194,
+  SI32195,
+  SI32196,
+  SI32197,
+  SI32198,
+  SI32199,
+  SI3050 = 100,
+  UNSUPPORTED_PART_NUM = 255
+} partNumberType;
+
+#define IS_SI3219X(SI_DEVPTR) ( ( (SI_DEVPTR)->chipType >= SI32190) && ( (SI_DEVPTR)->chipType <= SI32199) )
+
+/**
+* Chip revision definition for easier readability in the source code
+*/
+typedef enum
+{
+  A,
+  B,
+  C,
+  D,
+  E,
+  F,
+  G
+} revisionType ;
+
+
+typedef enum
+{
+  UNKNOWN, /**< Channel type has not been initialized or is still unknown */
+  PROSLIC, /**< Channel type is a ProSLIC/FXS */
+  DAA      /**< Channel type is a DAA/FXO */
+} channelTypeType;
+
+/**
+* These are the error codes for ProSLIC failures
+*/
+typedef enum
+{
+  RC_IGNORE = 0,
+  RC_NONE= 0,           /**< Means the function did not encounter an error */
+  RC_TEST_PASSED = 0,
+  RC_TEST_FAILED = 1,
+  RC_COMPLETE_NO_ERR = 1,   /**< A test completed, no error detected */
+  RC_POWER_ALARM_Q1,
+  RC_POWER_ALARM_Q2,
+  RC_POWER_ALARM_Q3,
+  RC_POWER_ALARM_Q4,
+  RC_POWER_ALARM_Q5,
+  RC_POWER_ALARM_Q6,
+  RC_SPI_FAIL,         /**< SPI Communications failure */
+  RC_POWER_LEAK,
+  RC_VBAT_UP_TIMEOUT,
+  RC_VBAT_OUT_OF_RANGE,
+  RC_VBAT_DOWN_TIMEOUT,
+  RC_TG_RG_SHORT,
+  RC_CM_CAL_ERR,
+  RC_RING_FAIL_INT,
+  RC_CAL_TIMEOUT,
+  RC_PATCH_ERR,
+  RC_BROADCAST_FAIL,           /**< Broadcast unavailable for requested operation */
+  RC_UNSUPPORTED_FEATURE,      /**< Feature is not supported by the chipset*/
+  RC_CHANNEL_TYPE_ERR,         /**< Channel type does not support called function */
+  RC_GAIN_DELTA_TOO_LARGE,     /**< Requested gain delta too large */
+  RC_GAIN_OUT_OF_RANGE,        /**< Gain requested exceeds range */
+  RC_POWER_ALARM_HVIC,         /**< Power alarm on HVIC */
+  RC_POWER_ALARM_OFFLD,        /**< Power alarm on offload transistor */
+  RC_THERMAL_ALARM_HVIC,       /**< Thermal alarm detected */
+  RC_NO_MEM,                   /**< Out of memory */
+  RC_INVALID_GEN_PARAM,        /**< Invalid general parameter */
+  RC_LINE_IN_USE,              /**< Line is in use (LCS detected) */
+  RC_RING_V_LIMITED,           /**< Ringer voltage limited - signal may be clipped */
+  RC_PSTN_CHECK_SINGLE_FAIL,   /**< PSTN detect single current exceeds limit */
+  RC_PSTN_CHECK_AVG_FAIL,      /**< PSTN detect average current exceeds limit */
+  RC_VDAA_ILOOP_OVLD,          /**< Overload detected */
+  RC_UNSUPPORTED_OPTION,       /**< Function parameter is not supported at this time */
+  RC_FDT_TIMEOUT,              /**< Timeout waiting for valid frame detect */
+  RC_PSTN_OPEN_FEMF,           /**< Detected FEMF, device left in open state */
+  RC_VDAA_PAR_HANDSET_DET,     /**< Parallel handset detected */
+  RC_VDAA_PAR_HANDSET_NOT_DET, /**< Parallel handset not detected */
+  RC_PATCH_RAM_VERIFY_FAIL,    /**< Patch RAM verification failure */
+  RC_PATCH_ENTRY_VERIFY_FAIL,  /**< Patch entry table verification failure */
+  RC_UNSUPPORTED_DEVICE_REV,   /**< Device revision not supported */
+  RC_INVALID_PATCH,            /**< No patch for selected options */
+  RC_INVALID_PRESET,           /**< Invalid Preset value */
+  RC_TEST_DISABLED,            /**< Test Not enabled */
+  RC_RING_START_FAIL,          /**< Ringing failed to start */
+  RC_MWI_ENABLE_FAIL,          /**< Failed to enable MWI feature */
+  RC_MWI_IN_USE,               /**< MWI active and unable to be modified */
+  RC_MWI_NOT_ENABLED,          /**< MWI not enabled */
+  RC_DCDC_SETUP_ERR,           /**< DCDC not properly initialized prior to powerup */
+  RC_PLL_FREERUN_ACTIVE,       /**< PLL In Freerun Mode */
+  RC_UNSUPPORTED_VDC_RANGE,    /**< VDC Range Unsupported */
+  RC_NON_FATAL_INIT_ERR,       /**< Generic error to indicate a non-fatal error during init */
+  RSPI_CONNECTION_FAILED,      /**< Client disconnected from server or vice versa */
+  RC_REINIT_REQUIRED = 255     /**< Soft Reset Required */
+} errorCodeType;
+
+/**********************************************************************/
+/**
+ * @defgroup PROLSIC_BRD_DESIGN Board design settings
+ * @{
+ */
+/**
+*  BOM Option Tag - refer to hardware design
+*/
+
+typedef enum
+{
+  DEFAULT,                      /**< DCDC: Unspecified */
+  BO_DCDC_FLYBACK,              /**< DCDC: flyback design */
+  BO_DCDC_LCQC_7P6W,            /**< DCDC: quasi-cuk design */
+  BO_DCDC_QCUK = BO_DCDC_LCQC_7P6W, /**< @deprecated DCDC: quasi-cuk design (deprecated name, use BO_DCDC_LCQC_7P6W) */
+  BO_DCDC_BUCK_BOOST,           /**< DCDC: BJT buck-boost design */
+  BO_DCDC_LCQC_3W,               /**< DCDC: low-cost quasi-cuk design */
+  BO_DCDC_LCQCUK = BO_DCDC_LCQC_3W, /**< DCDC: low-cost quasi-cuk design */
+  BO_DCDC_P_BUCK_BOOST_5V,      /**< @deprecated DCDC: PMOS buck-boost 5v design */
+  BO_DCDC_P_BUCK_BOOST_12V,     /**< @deprecated DCDC: PMOS buck-boost 12v design */
+  BO_DCDC_P_BUCK_BOOST_12V_HV,  /**< @deprecated DCDC: PMOS buck-boost 12v design, high voltage */
+  BO_DCDC_CUK,                  /**< DCDC: full cuk design */
+  BO_DCDC_PMOS_BUCK_BOOST,      /**< @deprecated DCDC: PMOS buck-boost design */
+  BO_DCDC_LCQC_6W,              /**< DCDC: low cost quasi-cuk design, 6W capability */
+  BO_DCDC_LCQC_5W,               /**< DCDC: low cost quasi-cuk design, 5W capability - '180 & '280 parts */
+  BO_DCDC_LCCB,                 /**< DCDC: low cost capacitive boost design - '180 & '280 parts */
+  BO_DCDC_LCUB,
+  BO_DCDC_LCCB110,
+  BO_DCDC_LCFB
+} bomOptionsType;
+
+/**
+*  VDC input voltage range option tags - please refer hardware design
+*/
+typedef enum
+{
+  VDC_3P0_6P0,
+  VDC_4P5_16P0,
+  VDC_4P5_27P0,
+  VDC_7P0_20P0,
+  VDC_8P0_16P0,
+  VDC_9P0_15P0,
+  VDC_9P0_16P0,
+  VDC_9P0_24P0,
+  VDC_10P8_20P0,
+  VDC_27P0_42P0,
+  VDC_10P8_13P2
+} vdcRangeType;
+
+/**
+*  Battery Rail option tags - please refer hardware design
+*/
+typedef enum
+{
+  BO_DCDC_TSS,        /**< Used for Fixed Rail DC-DC supplies */
+  BO_DCDC_TRACKING,   /**< Used for Tracking DC-DC supplies */
+  BO_DCDC_EXTERNAL,   /**< Used for external fixed rail supplies */
+  BO_DCDC_TSS_ISO,    /**< Used for isolated TSS supplies */
+  BO_DCDC_QSS,        /**< Used for QSS Designs */
+  BO_DCDC_FIXED_RAIL = BO_DCDC_TSS     /**< Fixed rail replaced by TSS */
+#ifndef SIVOICE_CFG_NEWTYPES_ONLY
+  ,FIXED = BO_DCDC_FIXED_RAIL /**< @deprecated use BO_DCDC_FIXED_RAIL */
+  ,TRACKING = BO_DCDC_TRACKING  /**< @deprecated use BO_DCDC_TRACKING */
+#endif
+  ,BO_DCDC_UNKNOWN
+} batRailType;
+
+/**
+*  FET Gate Driver option tags
+*/
+
+typedef enum
+{
+  BO_GDRV_NOT_INSTALLED = 0,
+  BO_GDRV_INSTALLED     = 1
+} gateDriveType;
+
+/**
+*  Auto ZCAL Enable option tags
+*/
+
+typedef enum
+{
+  AUTO_ZCAL_DISABLED  = 0,
+  AUTO_ZCAL_ENABLED   = 1
+} autoZcalType;
+
+/**
+*  VDAA Support option tags
+*/
+typedef enum
+{
+  VDAA_DISABLED = 0,
+  VDAA_ENABLED  = 1
+} vdaaSupportType;
+
+/**
+*  PM BOM Support option tags
+*/
+
+typedef enum
+{
+  BO_STD_BOM,
+  BO_PM_BOM
+} pmBomType;
+
+/**
+* Initialization options to allow init flow and/or content to be
+* altered at runtime
+*/
+typedef enum
+{
+  INIT_NO_OPT,        /**<  No initialization option */
+  INIT_REINIT,        /**<  Reinitialization option */
+  INIT_NO_CAL,        /**<  Skip calibration only - DEBUG use only */
+  INIT_NO_PATCH_LOAD, /**<  Skip patch load - DEBUG use only */
+  INIT_SOFTRESET      /**<  SLIC is running after a SOC reset */
+} initOptionsType;
+
+/**
+** This is the main Voice device object
+*/
+typedef struct
+{
+  SiVoiceControlInterfaceType
+  *ctrlInterface;           /**< How do we talk to the system? User supplied functions are connected here */
+  revisionType chipRev;     /**< What revision is the chip? */
+  partNumberType chipType;  /**< What member of the particular family is this chip? */
+  uInt8 lsRev;              /**< DAA: what rev is the line side chip? */
+  uInt8 lsType;             /**< DAA: what type is the line side chip */
+} SiVoiceDeviceType;
+
+typedef SiVoiceDeviceType *SiVoiceDeviceType_ptr; /**< Shortcut typedef */
+
+#ifdef SIVOICE_NEON_MWI_SUPPORT
+/*
+** Defines structure for storing MWI params
+*/
+typedef struct
+{
+  ramData ringof;
+  ramData ringamp;
+  ramData vbatr_expect;
+  ramData vov_ring_bat;
+  ramData vov_ring_gnd;
+  ramData rtacth;
+  ramData rtdcth;
+  ramData iring_lim;
+  ramData dcdc_rngtype;
+  ramData slope_ring;
+  ramData rtper;
+  ramData ringfr;
+  ramData rtdcdb;
+  ramData lcrmask;
+  ramData dcdc_oithresh_lo;
+  uInt8 enhance;
+  uInt8 ringcon;
+  uInt8 userstat;
+  uInt8 linefeed;
+} SiVoice_MWI_Store;
+#endif
+
+/* Define a complete ring cadence */
+typedef struct
+{
+ uInt32 steps;  /* In ticks */
+ uInt32 onTime;
+ uInt32 offTime; /* "" */
+ uInt32 step_size;
+ uInt32 von;
+ uInt32 voff;
+} SiVoice_MWI_poll_t;
+
+typedef enum
+{
+  PROSLIC_MWI_ON,
+  PROSLIC_MWI_OFF,
+  PROSLIC_MWI_RAMP_ON,
+  PROSLIC_MWI_RAMP_OFF
+} SiVoice_MWIrampStates_t;
+
+typedef struct
+{
+  SiVoice_MWI_poll_t       poll;
+  SiVoice_MWIrampStates_t  state;
+  uInt32                   ticks; /* How many ticks left to next state? */
+} SiVoice_MWIrampState_t;
+
+/**
+** This is the main ProSLIC channel object
+*/
+typedef struct
+{
+  SiVoiceDeviceType_ptr
+  deviceId;             /**< Information about the device associated with this channel */
+  uInt8 channel;        /**< Which channel is this device? This is a system parameter meaning if you have 2 dual channel devices in your system, this number would then typically go from 0-3 */
+  channelTypeType channelType; /**< Is this a ProSLIC or a DAA */
+  errorCodeType error;  /**< Storage for the current error state - used only for APIs that don't return back an error */
+  int debugMode;        /**< Are we debugging on this channel? */
+  int channelEnable;    /**<  is the channel enabled or not? If not, this channel is not initialized */
+  bomOptionsType bomOption; /**< Device/PCB specific */
+  uInt8 dcdc_polarity_invert;  /**<  Invert DCDC polarity from what is provided in general parameters */
+  uInt8 scratch;        /**< Internal use only */
+  uInt8 scratch2;       /**< Internal use only */
+#ifdef SIVOICE_NEON_MWI_SUPPORT
+  SiVoice_MWI_Store mwiSave;
+  SiVoice_MWIrampState_t mwiState;
+#endif
+} SiVoiceChanType;
+
+
+typedef SiVoiceChanType *SiVoiceChanType_ptr;
+/** @} */
+
+/*****************************************************************************/
+/** @defgroup SIVOICE_IF_CFG  SiVoice System control interface functions
+ *
+ * These functions are used by the ProSLIC API to access system resources
+ * such as SPI/GCI access, memory allocation/deallocation and timers.
+ *
+ * @{
+ */
+/*****************************************************************************/
+/** @defgroup SIVOICE_MEMORY_IF SiVoice Memory allocation/deallocation
+ *
+ * These functions dynamically allocate and deallocate memory for the given
+ * structures. malloc() and memset() are called for allocation and free() is
+ * called for deallocation.  These functions are typically called during
+ * initialization of the API and at the tear down of the API.  If customers
+ * prefer to use statically allocated structures, then they must ensure that
+ * the structure elements are zero'ed out.
+ *
+ * @{
+ */
+
+/**
+ @brief
+ *  Allocate memory and initialize the given structure.
+ *
+ * @param[in,out] pCtrlIntf - the structure to initialize
+ * @param[in] interface_count - number of device interfaces present.  Typically 1 interface per SPI controller.
+ *
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ * @sa SiVoice_destroyControlInterfaces
+ */
+
+int SiVoice_createControlInterfaces (SiVoiceControlInterfaceType **pCtrlIntf,
+                                     uInt32 interface_count);
+#define SiVoice_createControlInterface(X) SiVoice_createControlInterfaces((X),1)
+
+/**
+ @brief
+ *  Destroys the given structure and deallocates memory.
+ *
+ * @param[in,out] pCtrlIntf  - the structure to destroy/deallocate
+ *
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ * @sa SiVoice_createControlInterfaces
+ */
+
+int SiVoice_destroyControlInterfaces (SiVoiceControlInterfaceType **pCtrlIntf);
+#define SiVoice_destroyControlInterface SiVoice_destroyControlInterfaces
+
+/**
+ @brief
+ *  Allocate memory and initialize the given structure.
+ *
+ * @param[in,out] pDev - the structure to initialize
+ * @param[in] device_count - number of devices to allocate.
+ *
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ * @sa SiVoice_destroyDevices
+ */
+
+int SiVoice_createDevices (SiVoiceDeviceType **pDev, uInt32 device_count);
+#define SiVoice_createDevice(X) SiVoice_createDevices((X),1)
+
+/**
+ @brief
+ *  Destroys the given structure and deallocates memory.
+ *
+ * @param[in,out] pDev - the structure to destroy/deallocate
+ *
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ * @sa SiVoice_createDevices
+ */
+
+int SiVoice_destroyDevices (SiVoiceDeviceType **pDev);
+
+#define SiVoice_destroyDevice SiVoice_destroyDevices
+
+/**
+ @brief
+ *  Allocate memory and initialize the given structure.
+ *
+ * @param[in,out] pChan - the structure to initialize
+ * @param[in] channel_count - number of channels to allocate.
+ *
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ * @sa SiVoice_destroyChannels
+ */
+
+int SiVoice_createChannels (SiVoiceChanType_ptr *pChan, uInt32 channel_count);
+
+#define SiVoice_createChannel(X) SiVoice_createChannels((X),1)
+
+/**
+ @brief
+ *  Destroys the given structure and deallocates memory.
+ *
+ * @param[in,out] pChan - the structure to destroy/deallocate
+ *
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ * @sa SiVoice_createChannels
+ */
+
+#define SiVoice_destroyChannel SiVoice_destroyChannels
+int SiVoice_destroyChannels (SiVoiceChanType_ptr *pChan);
+/** @} SIVOICE_MEMORY_IF */
+
+/*****************************************************************************/
+/** @defgroup SIVOICE_IO SiVoice SPI/GCI access routines
+ * This group of functions are used to associate the transport mechanism (SPI, GCI) functions with the API.  The actual
+ * functions being references are normally implemented by the customer for their particular OS and platform.
+ *
+ * @{
+ */
+
+/**
+ @brief
+ *  Associate a interface object with a user supplied data structure.  This
+ *  structure is passed to all the I/O routines that the ProSLIC API calls.
+ *
+ * @param[in,out] pCtrlIntf - which interface to associate
+ *                the user supplied structure with.
+ * @param[in] *hCtrl - the user supplied structure that is passed to the IO functions.
+ *
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int SiVoice_setControlInterfaceCtrlObj (SiVoiceControlInterfaceType *pCtrlIntf,
+                                        void *hCtrl);
+
+/**
+ @brief
+ *  Associate a interface object with the reset function.
+ *
+ * @param[in,out] pCtrlIntf - which interface to associate
+ *                the user supplied function with.
+ * @param[in] Reset_fptr - the reset function pointer
+ *
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int SiVoice_setControlInterfaceReset (SiVoiceControlInterfaceType *pCtrlIntf,
+                                      ctrl_Reset_fptr Reset_fptr);
+
+/**
+ @brief
+ *  Associate a interface object with the register write function.
+ *
+ * @param[in,out] pCtrlIntf - which interface to associate
+ *                the user supplied function with.
+ * @param[in] WriteRegister_fptr - the register write function pointer
+ *
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int SiVoice_setControlInterfaceWriteRegister (SiVoiceControlInterfaceType
+    *pCtrlIntf, ctrl_WriteRegister_fptr WriteRegister_fptr);
+
+/**
+ @brief
+ *  Associate a interface object with the register read function.
+ *
+ * @param[in,out] pCtrlIntf - which interface to associate
+ *                the user supplied function with.
+ * @param[in] ReadRegister_fptr- the register read function pointer
+ *
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int SiVoice_setControlInterfaceReadRegister (SiVoiceControlInterfaceType
+    *pCtrlIntf, ctrl_ReadRegister_fptr ReadRegister_fptr);
+
+/**
+ @brief
+ *  Associate a interface object with the write RAM function.
+ *
+ * @param[in,out] pCtrlIntf - which interface to associate
+ *                the user supplied function with.
+ * @param[in] WriteRAM_fptr - the reset function pointer
+ *
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int SiVoice_setControlInterfaceWriteRAM (SiVoiceControlInterfaceType *pCtrlIntf,
+    ctrl_WriteRAM_fptr WriteRAM_fptr);
+
+/**
+ @brief
+ *  Associate a interface object with the read RAM function.
+ *
+ * @param[in,out] pCtrlIntf - which interface to associate
+ *                the user supplied function with.
+ * @param[in]  ReadRAM_fptr - the read RAM function pointer
+ *
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int SiVoice_setControlInterfaceReadRAM (SiVoiceControlInterfaceType *pCtrlIntf,
+                                        ctrl_ReadRAM_fptr ReadRAM_fptr);
+/** @} SIVOICE_IO */
+
+/*****************************************************************************/
+/** @defgroup SIVOICE_TIMER SiVoice Timer functions
+ *
+ * This group of functions associates the customer supplied timer routines with
+ * the ProSLIC API. Please note, for most applications, only the delay routine
+ * is required.  The other routines are needed for the pulse digit API.
+ * @{
+ */
+
+/**
+ @brief
+ *  This function associates a timer object - which is user defined, but it is
+ *  used with ALL channels of the particular control interface.
+ *
+ *  @param[in] pCtrlIntf which control interface to associate the given timer object with.
+ *  @param[in] *hTimer - the timer ojbect that is passed to all timer functions.
+ *  @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ *  @sa SiVoice_setControlInterfaceDelay SiVoice_setControlInterfaceTimeElapsed SiVoice_setControlInterfaceGetTime PROSLIC_TIMER
+ */
+
+int SiVoice_setControlInterfaceTimerObj (SiVoiceControlInterfaceType *pCtrlIntf,
+    void *hTimer);
+
+/**
+ @brief
+ *  Associate a timer delay function with a given control interface.  The
+ *  delay function takes in an argument of the timer object and the time in mSec
+ *  and delays the thread/task for at least the time requested.
+ *
+ * @param[in] pCtrlIntf - which control interface to associate the function with.
+ * @param[in] Delay_fptr - the pointer to the delay function.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ *  @sa SiVoice_setControlInterfaceTimerObj SiVoice_setControlInterfaceTimeElapsed SiVoice_setControlInterfaceGetTime PROSLIC_TIMER
+ */
+
+int SiVoice_setControlInterfaceDelay (SiVoiceControlInterfaceType *pCtrlIntf,
+                                      system_delay_fptr Delay_fptr);
+
+/**
+ *  Description:
+ *   Associate a time elapsed function with a given control interface.  The
+ *   time elapsed function uses the values from the function specified in
+ *   @ref SiVoice_setControlInterfaceGetTime and computes the delta time
+ *   in mSec.
+ *  @param[in] pCtrlIntf - which control interface to associate the function with.
+ *  @param[in] timeElapsed_fptr - the pointer to the elapsed time function.
+ *  @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *  @sa SiVoice_setControlInterfaceTimerObj SiVoice_setControlInterfaceGetTime SiVoice_setControlInterfaceDelay PROSLIC_TIMER
+ */
+
+int SiVoice_setControlInterfaceTimeElapsed (SiVoiceControlInterfaceType
+    *pCtrlIntf, system_timeElapsed_fptr timeElapsed_fptr);
+
+/**
+ *  Description:
+ *   Associate a time get function with a given control interface.  The
+ *   time get function returns a value in a form of a void pointer that
+ *   is suitable to be used with the function specified in @ref SiVoice_setControlInterfaceTimeElapsed .
+ *   This is typically used as a timestamp of when an event started. The resolution needs to be in terms
+ *   of mSec.
+ *
+ *  @param[in] pCtrlIntf - which control interface to associate the function with.
+ *  @param[in] getTime_fptr -  the pointer to the get time function.
+ *  @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *  @sa SiVoice_setControlInterfaceTimerObj SiVoice_setControlInterfaceTimeElapsed SiVoice_setControlInterfaceDelay PROSLIC_TIMER
+ */
+
+int SiVoice_setControlInterfaceGetTime (SiVoiceControlInterfaceType *pCtrlIntf,
+                                        system_getTime_fptr getTime_fptr);
+
+/** @} SIVOICE_TIMER */
+
+/*****************************************************************************/
+/** @defgroup SIVOICE_PROC_CONTROL SiVoice Process control
+ * @{
+ */
+
+/**
+ @brief
+ *  This function associates a user defined semaphore/critical section
+ *  function with the given interface.
+ *
+ * @param[in,out] pCtrlIntf the interface to associate the function with.
+ * @param[in] semaphore_fptr - the function pointer for semaphore control.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int SiVoice_setControlInterfaceSemaphore (SiVoiceControlInterfaceType
+    *pCtrlIntf, ctrl_Semaphore_fptr semaphore_fptr);
+
+/** @} SIVOICE_PROC_CONTROL */
+/*****************************************************************************/
+/** @} SIVOICE_IF_CFG*/
+/*****************************************************************************/
+/** @defgroup SIVOICE_INIT Initialization routines
+ * @{
+ */
+
+/**
+ @brief
+ *  This function initializes the various channel structure elements.
+ *  This function does not access the chipset directly, so SPI/GCI
+ *  does not need to be up during this function call.
+ *
+ * @param[in,out] hProslic - which channel to initialize.
+ * @param[in] channel - Which channel index is this.  For example, for a 4 channel system, this would typically range from 0 to 3.
+ * @param[in] chipType - chipset family type for example @ref SI3217X_TYPE or @ref SI3217X_TYPE
+ * @param[in] pDeviceObj - Device structure pointer associated with this channel
+ * @param[in] pCtrlIntf - Control interface associated with this channel
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @sa ProSLIC_SWInitChan
+ */
+
+int SiVoice_SWInitChan (SiVoiceChanType_ptr hProslic,int channel,int chipType,
+                        SiVoiceDeviceType *pDeviceObj, SiVoiceControlInterfaceType *pCtrlIntf);
+
+/**
+ @brief
+ * This function calls the user supplied reset function to put and take out the channel from reset. This is
+ * typically done during initialization and may be assumed to be a "global" reset - that is 1 reset per
+ * daisychain vs. 1 per device.
+ *
+ * @note This function can take more than 500 mSec to complete.
+ *
+ * @param[in] pChan - which channel to reset, if a "global reset", then any channel on the daisy chain is sufficient.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ */
+
+int SiVoice_Reset (SiVoiceChanType_ptr pChan);
+
+/** @} SIVOICE_INIT */
+
+/*****************************************************************************/
+/** @defgroup SIVOICE_DEBUG Debug
+ * @{
+ */
+
+/**
+ @brief
+ * This function enables or disables the debug mode, assuming @ref ENABLE_DEBUG is set in the configuration file.
+ *
+ * @param[in] pChan - which channel to set the debug flag.
+ * @param[in] debugEn - 0 = Not set, 1 = set.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ */
+
+int SiVoice_setSWDebugMode (SiVoiceChanType_ptr pChan, int debugEn);
+
+/**
+ @brief
+ * This function enables or disables the debug mode, assuming @ref ENABLE_TRACES is set in the configuration file.
+ *
+ * @param[in] pChan - which channel to set the debug flag.
+ * @param[in] traceEn - 0 = Not set, 1 = set.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ */
+
+int SiVoice_setTraceMode (SiVoiceChanType_ptr pChan, int traceEn);
+
+/**
+ * @brief
+ * This function allows access to SPI read register function pointer from interface
+ *
+ * @param[in] hProslic - pointer to channel structure
+ * @param[in] addr - address to read
+ * @retval uInt8 - register contents
+ *
+ */
+
+uInt8 SiVoice_ReadReg (SiVoiceChanType_ptr hProslic, uInt8 addr);
+
+/**
+ * @brief
+ * This function allows access to SPI write register function pointer from interface
+ *
+ * @param[in] pProslic - pointer to channel structure
+ * @param[in] addr - address to write
+ * @param[in] data to be written
+ * @retval int - @ref RC_NONE
+ *
+ */
+int SiVoice_WriteReg (SiVoiceChanType_ptr pProslic, uInt8 addr, uInt8 data);
+
+/** @} SIVOICE_DEBUG */
+
+/*****************************************************************************/
+/** @defgroup SIVOICE_ERROR Return code functions
+ * @{
+ */
+
+/**
+ @brief
+ * This function returns the error flag that may be set by some function in where
+ * @ref errorCodeType is not returned.
+ *
+ * @note For functions that DO return errorCodeType, the return value here is undefined.
+ *
+ * @param[in] pChan - which channel to clear the error flag
+ * @param[in,out] *error - The current value of error flag.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @sa SiVoice_clearErrorFlag
+ */
+
+int SiVoice_getErrorFlag (SiVoiceChanType_ptr pChan, int *error);
+
+/**
+ @brief
+ *  This function clears the error flag that may be set by some function in where
+ *  @ref errorCodeType is not returned.
+ *
+ * @param[in,out] pChan - which channel to clear the error flag
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @sa SiVoice_getErrorFlag
+ */
+
+int SiVoice_clearErrorFlag (SiVoiceChanType_ptr pChan);
+
+/** @} SIVOICE_ERROR */
+
+/*****************************************************************************/
+/** @defgroup SIVOICE_ENABLE Enable/disable channels (for init)
+ * @{
+ */
+/**
+ @brief
+ *  This function sets the channel enable status.  If NOT set, then when
+ *  the various initialization routines such as @ref SiVoice_SWInitChan is called,
+ *  then this particular channel will NOT be initialized.
+ *
+ *  This function does not access the chipset directly, so SPI/GCI
+ *  does not need to be up during this function call.
+ *
+ * @param[in,out] pChan - which channel to return the status.
+ * @param[in] chanEn - The new value of the channel enable field. 0 = NOT enabled, 1 = enabled.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @sa SiVoice_getChannelEnable
+ */
+
+int SiVoice_setChannelEnable (SiVoiceChanType_ptr pChan, int chanEn);
+
+/**
+ @brief
+ *  This function returns back if the channel is enabled or not.
+ *  This function does not access the chipset directly, so SPI/GCI
+ *  does not need to be up during this function call.
+ *
+ * @param[in] pChan - which channel to return the status.
+ * @param[in,out] chanEn* - The current value of if the channel is enabled. 0 = NOT enabled, 1 = enabled.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @sa SiVoice_setChannelEnable
+ */
+
+int SiVoice_getChannelEnable (SiVoiceChanType_ptr pChan, int *chanEn);
+
+/** @} SIVOICE_ENABLE */
+/** @defgroup SIVOICE_MISC Other functions that don't fit into other categories
+ * @{
+ */
+/**
+ @brief
+ * This function returns the current version of the ProSLIC API release as
+ * a NULL terminated string.
+ * @retval char * - string containing the API release string.
+ */
+char *SiVoice_Version(void);
+
+/**
+ * @brief
+ * This function probes an array of channel pointers to determine the number of
+ * ProSLIC's,if not NULL and DAA's, if not NULL. Should only be called after a reset.
+ * @param[in,out] pProslic - an array of channel pointers to iterate through.  ChannelType is modified.
+ * @param[in] size - number of channels to pobe.
+ * @param[out] slicCount - if not NULL, the number of SLIC's detected.
+ * @param[out] daaCount - if not NULL, the number of DAA's detected.
+ * @retval RC_NONE if successful.
+ */
+int SiVoice_IdentifyChannels(SiVoiceChanType_ptr *pProslic, int size,
+                             int *slicCount, int *daaCount);
+
+/** @} SIVOICE_MISC */
+
+/*****************************************************************************/
+/** @} SIVOICE */
+#endif
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/inc/si_voice_ctrl.h b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/inc/si_voice_ctrl.h
new file mode 100644
index 0000000..4eb5178
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/inc/si_voice_ctrl.h
@@ -0,0 +1,121 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * si_voice_ctrl.h
+ * SPI driver header file
+ *
+ * Author(s):
+ * laj
+ *
+ * Distributed by:
+ * Silicon Laboratories, Inc
+ *
+ * File Description:
+ * This is the header file for the control driver used
+ * in the ProSLIC demonstration code.
+ *
+ *
+ */
+
+#ifndef CTRL_H
+#define CTRL_H
+
+/** @defgroup PROSLIC_CUSTOMER_APIS Customer implemented functions
+ * This section has documentation related to APIs that the customer
+ * needs to implement to allow the ProSLIC API to function correctly.
+ *
+ * @note Please note, in addition to the functions mentioned here, the
+ * customer will need to review/modify si_voice_datatypes.h to match
+ * the native datatypes of their system.
+ *
+ * @{
+ */
+/*****************************************************************************/
+/** @defgroup PROSLIC_CUSTOMER_CONTROL Customer implemented control functions
+ * This group of function pointer prototypes need to be implemented by the
+ * customer in order for the ProSLIC API to function correctly.  These functions
+ * need to be associated with the API by the functions documented in @ref SIVOICE_IO
+ * @{
+ */
+
+/**
+* @brief
+* Sets/clears the reset pin of all the ProSLICs/VDAAs
+*
+* @param[in] *hCtrl - which interface to reset (this is a customer supplied structure)
+* @param[in] in_reset -  0 = Take the device out of reset, 1 = place the device(s) in reset
+* @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+*/
+
+typedef int (*ctrl_Reset_fptr) (void *hCtrl, int in_reset);
+
+/**
+* @brief
+* Register write function pointer
+*
+* @param[in] *hCtrl - which interface to communicate through (this is a customer supplied structure)
+* @param[in] channel - ProSLIC channel to write to (this is the value passed is the same as found in @ref SiVoice_SWInitChan)
+* @param[in] regAddr -  Address of register to write
+* @param[in] data - data to write to register
+* @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+*
+*/
+
+typedef int (*ctrl_WriteRegister_fptr) (void *hCtrl, uInt8 channel,
+                                        uInt8 regAddr, uInt8 data);
+
+/**
+* @brief
+* RAM write function pointer
+*
+* @param[in] *hCtrl - which interface to communicate through (this is a customer supplied structure)
+* @param[in] channel - ProSLIC channel to write to (this is the value passed is the same as found in @ref SiVoice_SWInitChan)
+* @param[in] ramAddr - Address of the RAM location to write
+* @param[in] ramData - data to write to the RAM location
+* @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+*
+*/
+
+typedef int (*ctrl_WriteRAM_fptr) (void *hCtrl, uInt8 channel, uInt16 ramAddr,
+                                   ramData data);
+
+/**
+* @brief
+* Register read function pointer
+*
+* @param[in] *hCtrl - which interface to communicate through (this is a customer supplied structure)
+* @param[in] channel - ProSLIC channel to read from (this is the value passed is the same as found in @ref SiVoice_SWInitChan)
+* @param[in] regAddr -  Address of register to read from
+* @retval uInt8 - the value read. If an error occurs, this value is undefined.
+*/
+
+typedef uInt8 (*ctrl_ReadRegister_fptr) (void *hCtrl, uInt8 channel,
+    uInt8 regAddr);
+
+/**
+* @brief
+* RAM read function pointer
+*
+* @param[in] *hCtrl - which interface to communicate through (this is a customer supplied structure)
+* @param[in] channel - ProSLIC channel to read from (this is the value passed is the same as found in @ref SiVoice_SWInitChan)
+* @param[in] ramAddr - Address of the RAM location to read from
+* @retval ramData - the value read. If an error occurs, this value is undefined.
+*/
+
+typedef ramData (*ctrl_ReadRAM_fptr) (void *hCtrl, uInt8 channel,
+                                      uInt16 ramAddr);
+
+/**
+ * @brief
+ *  Critical Section/Semaphore function pointer
+ *
+* @param[in] *hCtrl - which interface to communicate through (this is a customer supplied structure)
+* @param[in] in_critical_section - request to lock the critical section 1 = lock, 0 = unlock
+* @retval 1 = success, 0 = failed
+*/
+
+typedef int (*ctrl_Semaphore_fptr) (void *hCtrl, int in_critical_section);
+
+/** @} PROSLIC_CUSTOMER_CONTROL */
+/** @} */
+#endif
+
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/inc/si_voice_timer_intf.h b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/inc/si_voice_timer_intf.h
new file mode 100644
index 0000000..b4be48f
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/inc/si_voice_timer_intf.h
@@ -0,0 +1,103 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * System specific functions header file
+ *
+ * Author(s):
+ * laj
+ *
+ * Distributed by:
+ * Silicon Laboratories, Inc
+ *
+ * File Description:
+ * This is the header file for the system specific functions like timer functions.
+ *
+ *
+ */
+
+#ifndef TIMER_INTF_H
+#define TIMER_INTF_H
+
+/** @addtogroup PROSLIC_CUSTOMER_APIS
+ * @{
+ * @defgroup PROSLIC_CUSTOMER_TIMER Customer implemented timer functions
+ * This section has documentation related to timers: delays and timestamps.  The void * is a customer
+ * supplied timer data structure that the user specifies in @ref SiVoice_setControlInterfaceTimerObj.
+ * These functions need to be associated with the functions documented in @ref SIVOICE_TIMER
+ *
+ * @note For the majority of implementations, the only function that is required is the delay function.
+ *
+ * @{
+ */
+
+/**
+ * @brief
+ * System time delay function pointer
+ *
+ * @param[in] hTimer - the system timer object
+ * @param[in] timeInMS - number of mSec to suspend the task/thread executing.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+*/
+
+typedef int (*system_delay_fptr) (void *hTimer, int timeInMs);
+
+/**
+ * @brief
+ * System time elapsed function pointer
+ *
+ * @details
+ * This function combined with @ref system_getTime_fptr function allow one to determine
+ * the time elapsed between the two event times.
+ *
+ * The example pseudo code below shows how one may see this function used in conjunction with
+ * the function pointed by @ref system_getTime_fptr to do some processing while waiting
+ * for a time to expire.
+ *
+ * @code
+ * my_timer_obj time_now;
+ *
+ * getTime(my_prosclic_obj->timer_obj_ptr, (void *)(&time_now));
+ *
+ *  Some events occur here...
+ *
+ * do
+ * {
+ *     time_elapsed(my_proslic_obj->timer_obj_ptr,(void *)(&time_now), &elapsed_time_mSec);
+ *
+ *     Do something here...
+ *
+ *  }while(elapsed_time_mSec < Desired delay);
+ *
+ * Change state...
+ *
+ * @endcode
+ *
+ * @param[in] *hTimer - the system timer object
+ * @param[in] *startTime - the time object returned by @ref system_getTime_fptr - the "start time" of the event.
+ * @param[out] *timeInMs - the time in mSec between the "start time" and the current time.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ * @sa system_getTime_fptr
+*/
+
+typedef int (*system_timeElapsed_fptr) (void *hTimer, void *startTime,
+                                        int *timeInMs);
+
+/**
+ * @brief
+ * Retrieve system time in mSec resolution.
+ *
+ * @details
+ * This function combined with @ref system_timeElapsed_fptr function allow one to determine
+ * the time elapsed between the two event times.
+ *
+ * @param[in] *hTimer - the system timer object
+ * @param[in] *time - the time stamp object needed by @ref system_timeElapsed_fptr
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ * @sa system_timeElapsed_fptr
+*/
+
+typedef int (*system_getTime_fptr) (void *hTimer, void *time);
+
+/** @}
+ * @} */
+#endif
+
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/inc/vdaa.h b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/inc/vdaa.h
new file mode 100644
index 0000000..91ae85c
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/inc/vdaa.h
@@ -0,0 +1,1144 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Vdaa  VoiceDAA interface header file
+ *
+ *
+ * Distributed by:
+ * Silicon Laboratories, Inc
+ *
+ * This file contains proprietary information.
+ * No dissemination allowed without prior written permission from
+ * Silicon Laboratories, Inc.
+ *
+ * File Description:
+ * This is the header file for the main  VoiceDAA API and is used
+ * in the  VoiceDAA demonstration code.
+ *
+ *
+ */
+
+#ifndef VDAA_INTF_H
+#define VDAA_INTF_H
+
+#include "../config_inc/si_voice_datatypes.h"
+#include "si_voice.h"
+/*****************************************************************************/
+/** @defgroup VDAA_API VDAA API
+ * This section covers APIs and definitions related to the VDAA/FXO.
+ * @{
+ */
+
+/*
+** Constants
+*/
+#define BROADCAST 0xff
+#define LCS_SCALE_NUM 33		/* Line Current Status Scale */
+#define LCS_SCALE_DEN 10		/* Line Current Status Scale */
+
+/* Macro substitution from Vdaa legacy API's to SiVoice API's */
+#define Vdaa_createControlInterface SiVoice_createControlInterface
+#define Vdaa_destroyControlInterface SiVoice_destroyControlInterface
+#define Vdaa_createDevice SiVoice_createDevice
+#define Vdaa_destroyDevice SiVoice_destroyDevice
+#define Vdaa_createChannel SiVoice_createChannel
+#define Vdaa_destroyChannel SiVoice_destroyChannel
+
+#define Vdaa_setControlInterfaceCtrlObj SiVoice_setControlInterfaceCtrlObj
+#define Vdaa_setControlInterfaceReset SiVoice_setControlInterfaceReset
+#define Vdaa_setControlInterfaceWriteRAM SiVoice_setControlInterfaceWriteRAM
+#define Vdaa_setControlInterfaceReadRAM SiVoice_setControlInterfaceReadRAM
+#define Vdaa_setControlInterfaceWriteRegister SiVoice_setControlInterfaceWriteRegister
+#define Vdaa_setControlInterfaceReadRegister SiVoice_setControlInterfaceReadRegister
+#define Vdaa_setControlInterfaceTimerObj SiVoice_setControlInterfaceTimerObj
+#define Vdaa_setControlInterfaceDelay SiVoice_setControlInterfaceDelay
+#define Vdaa_setControlInterfaceSemaphore SiVoice_setControlInterfaceSemaphore
+#define Vdaa_setControlInterfaceTimeElapsed SiVoice_setControlInterfaceTimeElapsed
+#define Vdaa_setControlInterfaceGetTime SiVoice_setControlInterfaceGetTime
+
+#define Vdaa_SWInitChan SiVoice_SWInitChan
+
+#define Vdaa_setSWDebugMode SiVoice_setSWDebugMode
+#define Vdaa_getErrorFlag SiVoice_getErrorFlag
+#define Vdaa_clearErrorFlag SiVoice_clearErrorFlag
+
+#define Vdaa_setChannelEnable SiVoice_setChannelEnable
+#define Vdaa_getChannelEnable SiVoice_getChannelEnable
+
+#define Vdaa_Reset SiVoice_Reset
+#define Vdaa_Version SiVoice_Version
+
+#define SI3050_CHAN_PER_DEVICE 1
+
+/*
+**
+** VDAA Initialization/Configuration Parameter Options
+**
+*/
+/*
+** This defines names for the PCM Data Format
+*/
+typedef enum
+{
+  A_LAW = 0,	/**< 00 = A-Law. Signed magnitude data format */
+  U_LAW = 1,	/**< 01 = u-Law. Signed magnitude data format */
+  LINEAR_16_BIT = 3 /**< 11 = 16-bit linear (2s complement data format) */
+} tPcmFormat;
+
+/*
+** This defines names for the phcf bits
+*/
+typedef enum
+{
+  PCLK_1_PER_BIT = 0,
+  PCLK_2_PER_BIT = 1
+} tPHCF;
+
+
+/*
+** This defines names for the tri bit
+*/
+typedef enum
+{
+  TRI_POS_EDGE = 0,
+  TRI_NEG_EDGE = 1
+} tTRI;
+
+
+/**
+** This defines names for the AC impedance range
+*/
+typedef enum
+{
+  AC_600,				/**< 600 Ohms */
+  AC_900,				/**< 900 O */
+  AC_270__750_150,		/**< 270 O + (750 O || 150 nF) and 275 O + (780 O || 150 nF) */
+  AC_220__820_120,		/**< 220 O + (820 O || 120 nF) and 220 O + (820 O || 115 nF) */
+  AC_370__620_310,		/**< 370 O + (620 O || 310 nF) */
+  AC_320__1050_230,		/**< 320 O + (1050 O || 230 nF) */
+  AC_370__820_110,		/**< 370 O + (820 O || 110 nF) */
+  AC_275__780_115,		/**< 275 O + (780 O || 115 nF) */
+  AC_120__820_110,		/**< 120 O + (820 O || 110 nF) */
+  AC_350__1000_210,		/**< 350 O + (1000 O || 210 nF) */
+  AC_200__680_100,		/**< 200 O + (680 O || 100 nF) */
+  AC_600__2160,			/**< 600 O + 2.16 uF */
+  AC_900__1000,			/**< 900 O + 1 uF */
+  AC_900__2160,			/**< 900 O + 2.16 uF */
+  AC_600__1000,			/**< 600 O + 1 uF */
+  AC_Global_impedance		/**< Global impedance */
+} tAC_Z;
+
+/**
+** This defines names for the DC impedance range
+*/
+typedef enum
+{
+  DC_50,					/**< 50 Ohms dc termination is selected */
+  DC_800					/**< 800 Ohms dc termination is selected */
+
+} tDC_Z;
+
+/**
+** This defines names for the ringer impedance range
+*/
+typedef enum
+{
+  RZ_MAX = 0,
+  RZ_SYNTH = 1
+} tRZ;
+
+/**
+** This defines names for the dc voltage adjust
+*/
+typedef enum
+{
+  DCV3_1 = 0,
+  DCV3_2 = 1,
+  DCV3_35 = 2,
+  DCV3_5 = 3
+} tDCV;
+
+/**
+** This defines names for the minimum loop current
+*/
+typedef enum
+{
+  MINI_10MA = 0,
+  MINI_12MA = 1,
+  MINI_14MA = 2,
+  MINI_16MA = 3
+} tMINI;
+
+/**
+** This defines names for the current limiting enable bit
+*/
+typedef enum
+{
+  ILIM_DISABLED = 0,
+  ILIM_ENABLED = 1
+} tILIM;
+
+/**
+** This defines names for the ring detect interupt mode
+*/
+typedef enum
+{
+  RDI_BEG_BURST = 0,
+  RDI_BEG_END_BURST = 1
+} tRDI;
+
+/**
+** This defines names for the on hook speed / spark quenching
+*/
+typedef enum
+{
+  OHS_LESS_THAN_0_5MS = 0,
+  OHS_3MS = 1,
+  OHS_26MS = 0xE
+} tOHS;
+
+/**
+** This defines names for the hbe bit
+*/
+typedef enum
+{
+  HYBRID_DISABLED = 0,
+  HYBRID_ENABLED  = 1
+} tHBE;
+
+
+/**
+** Gain/Attenuation Select
+*/
+typedef enum
+{
+  XGA_GAIN,
+  XGA_ATTEN
+} tXGA;
+
+/**
+** MUTE Control Options
+*/
+typedef enum
+{
+  MUTE_DISABLE_ALL,
+  MUTE_DISABLE_RX,
+  MUTE_DISABLE_TX,
+  MUTE_ENABLE_RX,
+  MUTE_ENABLE_TX,
+  MUTE_ENABLE_ALL
+} tMUTE;
+
+/**
+** This defines names for the ring delay setting
+*/
+typedef enum
+{
+  RDLY_0MS = 0,
+  RDLY_256MS = 1,
+  RDLY_512MS = 2,
+  RDLY_768MS = 3,
+  RDLY_1024MS = 4,
+  RDLY_1280MS = 5,
+  RDLY_1536MS = 6,
+  RDLY_1792MS = 7
+} tRDLY;
+
+/**
+** This defines names for the ring timeouts
+*/
+typedef enum
+{
+  RTO_128MS = 1,
+  RTO_256MS = 2,
+  RTO_384MS = 3,
+  RTO_512MS = 4,
+  RTO_640MS = 5,
+  RTO_768MS = 6,
+  RTO_896MS = 7,
+  RTO_1024MS = 8,
+  RTO_1152MS = 9,
+  RTO_1280MS = 10,
+  RTO_1408MS = 11,
+  RTO_1536MS = 12,
+  RTO_1664MS = 13,
+  RTO_1792MS = 14,
+  RTO_1920MS = 15
+} tRTO;
+
+/**
+** This defines names for the ring timeouts
+*/
+typedef enum
+{
+  RCC_100MS = 0,
+  RCC_150MS = 1,
+  RCC_200MS = 2,
+  RCC_256MS = 3,
+  RCC_384MS = 4,
+  RCC_512MS = 5,
+  RCC_640MS = 6,
+  RCC_1024MS = 7
+} tRCC;
+
+/**
+** This defines names for the ring validation modes
+*/
+typedef enum
+{
+  RNGV_DISABLED = 0,
+  RNGV_ENABLED = 1
+} tRNGV;
+
+/**
+** This defines names for the rfwe bit
+*/
+typedef enum
+{
+  RFWE_HALF_WAVE = 0,
+  RFWE_FULL_WAVE = 1,
+  RFWE_RNGV_RING_ENV = 0,
+  RFWE_RNGV_THRESH_CROSS = 1
+} tRFWE;
+
+/**
+** This defines names for the rt and rt2 bit
+*/
+typedef enum
+{
+  RT__13_5VRMS_16_5VRMS = 0,
+  RT__19_35VRMS_23_65VRMS = 2,
+  RT__40_5VRMS_49_5VRMS = 3
+} tRT;
+
+/**
+** This defines names for the rt and rt2 bit
+*/
+typedef enum
+{
+  RGDT_ACTIVE_LOW = 0,
+  RGDT_ACTIVE_HI = 1
+} tRPOL;
+
+
+/**
+** This defines names for the interrupts
+*/
+typedef enum
+{
+  POLI,
+  TGDI,
+  LCSOI,
+  DODI,
+  BTDI,
+  FTDI,
+  ROVI,
+  RDTI,
+  CVI		/**< Current/Voltage Interrupt REGISTER#44 */
+} vdaaInt;
+
+/**
+** Interrupt Bitmask Fields
+*/
+typedef enum
+{
+  POLM = 1,
+  TGDM = 2,   /**< Si3050  Only */
+  LCSOM = 4,
+  DODM = 8,
+  BTDM = 16,
+  FDTM = 32,
+  ROVM = 64,
+  RDTM = 128
+} vdaaIntMask;
+
+
+/**
+** This defines names for the idl bit (obsolete)
+*/
+typedef enum
+{
+  IDL_DISABLED = 0,
+  IDL_ENABLED = 1
+} tIDL;
+
+/**
+** This defines names for the ddl bit (obsolete)
+*/
+typedef enum
+{
+  DDL_NORMAL_OPERATION = 0,
+  DDL_PCM_LOOPBACK = 1
+} tDDL;
+
+/**
+** Loopback Modes
+*/
+typedef enum
+{
+  LPBK_NONE = 0,
+  LPBK_IDL = 1,
+  LPBK_DDL = 2,
+  LPBK_PCML = 3
+} tLpbkMode;
+
+/**
+** Loopback Status
+*/
+typedef enum
+{
+  LPBK_DISABLED = 0,
+  LPBK_ENABLED = 1
+} tLpbkStatus;
+
+/**
+** This defines names for the interrupt pin modes
+*/
+typedef enum
+{
+  INTE_DISABLED = 0,
+  INTE_ENABLED = 1
+} tInte;
+
+/**
+** This defines names for the interrupt pin polarities
+*/
+typedef enum
+{
+  INTE_ACTIVE_LOW = 0,
+  INTE_ACTIVE_HIGH = 1
+} tIntePol;
+
+/**
+** This defines names for the pwm settings
+*/
+typedef enum
+{
+  PWM_DELTA_SIGMA = 0,
+  PWM_CONVENTIONAL_16KHZ = 1,
+  PWM_CONVENTIONAL_32KHZ = 2
+} tPwmMode;
+
+/**
+** PWME
+*/
+typedef enum
+{
+  PWM_DISABLED = 0,
+  PWM_ENABLED
+} tPWME;
+
+/**
+** RCALD control
+*/
+typedef enum
+{
+  RES_CAL_ENABLED = 0,
+  RES_CAL_DISABLED
+} tRCALD;
+
+/**
+** Voice DAA Hook states
+*/
+enum
+{
+  VDAA_DIG_LOOPBACK = 1,
+  VDAA_ONHOOK = 2,
+  VDAA_OFFHOOK = 3,
+  VDAA_ONHOOK_MONITOR = 4
+};
+
+/**
+** FDT Monitoring Options
+*/
+enum
+{
+  FDT_MONITOR_OFF = 0,
+  FDT_MONITOR_ON
+};
+
+
+/**
+** Offhook Speed Select
+*/
+typedef enum
+{
+  FOH_512,
+  FOH_128,
+  FOH_64,
+  FOH_8
+} tFOH;
+
+/**
+** Sample Rate Control
+*/
+typedef enum
+{
+  FS_8KHZ,
+  FS_16KHZ
+} tHSSM;
+
+/**
+** Line Voltage Force Disable
+*/
+typedef enum
+{
+  LVS_FORCE_ENABLED = 0,
+  LVS_FORCE_DISABLED
+} tLVFD;
+
+/**
+** Current/Voltage Monitor Select
+*/
+typedef enum
+{
+  CVS_CURRENT,
+  CVS_VOLTAGE
+} tCVS;
+
+/**
+** Current/Voltage Interrupt Polarity
+*/
+typedef enum
+{
+  CVP_BELOW,
+  CVP_ABOVE
+} tCVP;
+
+/**
+** Guarded Clear
+*/
+typedef enum
+{
+  GCE_DISABLED = 0,
+  GCE_ENABLED
+} tGCE;
+
+/**
+** SPI Mode (Si3050 Only)
+*/
+typedef enum
+{
+  SPIM_TRI_CS,
+  SPIM_TRI_SCLK
+} tSPIM;
+
+/**
+**  FILT
+*/
+typedef enum
+{
+  FILT_HPF_5HZ,
+  FILT_HPF_200HZ
+} tFILT;
+
+/**
+** IIRE
+*/
+typedef enum
+{
+  IIR_DISABLED = 0,
+  IIR_ENABLED
+} tIIRE;
+
+/**
+** FULL2
+*/
+typedef enum
+{
+  FULL2_DISABLED = 0,
+  FULL2_ENABLED
+} tFULL2;
+
+/**
+** FULL
+*/
+typedef enum
+{
+  FULL_DISABLED = 0,
+  FULL_ENABLED
+} tFULL;
+
+/**
+** RG1
+*/
+typedef enum
+{
+  RG1_DISABLED = 0,
+  RG1_ENABLED
+} tRG1;
+
+
+/**
+** -----------------------------
+** CONFIGURATION DATA STRUCTURES
+** -----------------------------
+*/
+
+/**
+** (Updated) Structure for General Parameters
+*/
+typedef struct
+{
+  tInte inte;             /* INTE */
+  tIntePol intp;          /* INTP */
+  tRCALD rcald;           /* RCALD */
+  tHSSM hssm;             /* HSSM */
+  tFOH foh;               /* FOH */
+  tLVFD lvfd;             /* LVFD */
+  tCVS cvs;               /* CVS */
+  tCVP cvp;               /* CVP */
+  tGCE gce;               /* GCE */
+  tIIRE iire;             /* IIRE */
+  tFULL2 full2;           /* FULL2 */
+  tFULL full;             /* FULL */
+  tFILT filt;             /* FILT */
+  tRG1 rg1;               /* RG1 */
+  tPwmMode pwmm;          /* PWMM Si3050 Only */
+  tPWME pwmEnable;        /* PWME Si3050 Only */
+  tSPIM spim;             /* SPIM Si3050 Only */
+} vdaa_General_Cfg;
+
+
+/**
+** (NEW) Structure for Country Presets
+*/
+typedef struct
+{
+  tRZ rz;
+  tDC_Z dcr;
+  tAC_Z acim;
+  tDCV dcv;
+  tMINI mini;
+  tILIM ilim;
+  tOHS ohs_sq;
+  tHBE hbe;
+} vdaa_Country_Cfg;
+
+/**
+** (NEW) Structure for Hybrid Presets
+*/
+typedef struct
+{
+  uInt8 hyb1;
+  uInt8 hyb2;
+  uInt8 hyb3;
+  uInt8 hyb4;
+  uInt8 hyb5;
+  uInt8 hyb6;
+  uInt8 hyb7;
+  uInt8 hyb8;
+} vdaa_Hybrid_Cfg;
+
+/**
+** Structure for PCM configuration presets
+*/
+typedef struct
+{
+  tPcmFormat pcmFormat;
+  tPHCF pcmHwy;
+  tTRI pcm_tri;
+} vdaa_PCM_Cfg;
+
+/** @addtogroup VDAA_AUDIO
+ * @{
+ */
+/** @addtogroup VDAA_GAIN_CONTROL
+ * @{
+ */
+/*
+** (Updated) Structure for Audio path gain preset
+*/
+typedef struct
+{
+  uInt8		mute;
+  tXGA		xga2;
+  uInt8   	acgain2;
+  tXGA		xga3;
+  uInt8   	acgain3;
+  uInt8		callProgress;
+  BOOLEAN     cpEn;
+} vdaa_audioGain_Cfg;
+
+/** @} VDAA_GAIN_CONTROL*/
+/** @} */
+/*
+** Structure for configuring ring detect config
+*/
+
+typedef struct
+{
+  tRDLY rdly;
+  tRT rt;
+  uInt8 rmx;
+  tRTO rto;
+  tRCC rcc;
+  tRNGV rngv;
+  uInt8 ras;
+  tRFWE rfwe;
+  tRDI rdi;
+  tRPOL rpol;
+} vdaa_Ring_Detect_Cfg;
+
+
+/*
+** Defines structure of interrupt data
+*/
+typedef struct
+{
+  vdaaInt *irqs;
+  uInt8 number;
+} vdaaIntType;
+
+/*
+** Defines structure for configuring Loop Back
+*/
+typedef struct
+{
+  tIDL isoDigLB;
+  tDDL digDataLB;
+} vdaa_Loopback_Cfg;
+
+
+/*
+** Generic Flag
+*/
+typedef enum
+{
+  VDAA_BIT_SET = 1,
+  VDAA_BIT_CLEAR = 0
+} tVdaaBit;
+
+/*
+** Defines structure for daa current status (ring detect/hook stat)
+*/
+typedef struct
+{
+  tVdaaBit ringDetectedNeg;
+  tVdaaBit ringDetectedPos;
+  tVdaaBit ringDetected;
+  tVdaaBit offhook;
+  tVdaaBit onhookLineMonitor;
+} vdaaRingDetectStatusType;
+
+
+typedef SiVoiceControlInterfaceType vdaaControlInterfaceType;
+typedef SiVoiceDeviceType vdaaDeviceType;
+typedef SiVoiceChanType vdaaChanType;
+
+/*
+** This is the main  VoiceDAA interface object pointer
+*/
+typedef vdaaChanType *vdaaChanType_ptr;
+
+/*
+** Defines initialization data structures
+*/
+typedef struct
+{
+  uInt8 address;
+  uInt8 initValue;
+} vdaaRegInit;
+
+
+typedef enum
+{
+  PAR_HANDSET_NOT_DETECTED = 0,
+  PAR_HANDSET_DETECTED = 1
+} vdaaPHDStatus;
+
+/*
+** Line In Use Configuration Structure
+*/
+typedef struct
+{
+  vdaaPHDStatus status;
+  int8 min_onhook_vloop;
+  int8 min_offhook_vloop;
+  int16 min_offhook_iloop;
+  int8 measured_vloop;
+  int16 measured_iloop;
+} vdaa_LIU_Config;
+
+/*
+** Function Declarations
+*/
+
+/*****************************************************************************/
+/** @defgroup VDAA_AUDIO Audio
+ * @{
+ */
+/** @defgroup VDAA_GAIN_CONTROL Gain Control
+ * This section covers functions that allow one to adjust the audio
+ * gains - with TX toward the network/SOC/DSP and RX toward the tip/ring.
+ *
+ * @{
+ */
+
+/**
+ * @brief
+ *  Sets the TX audio gain (toward the network).
+ *
+ * @param[in] pVdaa - which channel to configure
+ * @param[in] preset - which preset to use (this may be from the constants file)
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int Vdaa_TXAudioGainSetup (vdaaChanType *pVdaa,int32 preset);
+
+/**
+ * @brief
+ *  Sets the RX audio gain (toward the tip/ring).
+ *
+ * @param[in] pVdaa - which channel to configure
+ * @param[in] preset - which preset to use (this may be from the constants file)
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int Vdaa_RXAudioGainSetup (vdaaChanType *pVdaa,int32 preset);
+
+/** @} VDAA_GAIN_CONTROL */
+
+/*****************************************************************************/
+/** @defgroup VDAA_AUDIO_CONTROL Audio control/configuration
+ * This group of functions is used to configure and control the PCM bus.  It is essential that @ref Vdaa_PCMSetup,
+ * @ref Vdaa_PCMTimeSlotSetup and @ref Vdaa_PCMStart are called prior to any audio processing.
+ * @{
+ */
+
+/**
+ * @brief
+ *  This configures the PCM bus with parameters such as companding and data latching timing.
+ *
+ * @param[in] pVdaa - which channel should be configured
+ * @param[in] preset - which preset to use from the constants file (see configuration tool, PCM dialog box)
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @sa Vdaa_PCMTimeSlotSetup ProSLIC_PCMStart
+ */
+
+int Vdaa_PCMSetup (vdaaChanType *pVdaa,int32 preset);
+
+/**
+ * @brief
+ *  This configures the ProSLIC to latch and send the PCM data at a particular timeslot in terms of PCM clocks (PCLK).
+ *
+ *  Typically, for aLaw and uLaw, one can use the following calculation to set the rxcount and txcount parameters:
+ *
+ *  rxcount = txcount = (channel_number)*8;
+ *
+ *  For 16 bit linear, one can do the following:
+ *
+ *  rxcount = txcount = (channel_number)*16;
+ *
+ * where channel_number = which ProSLIC channel on the PCM bus.  For example, if one were to have 2 dual channel
+ * VDAA's on the same PCM bus, this value would range from 0 to 3.
+ *
+ * @param[in] pVdaa - which channel should be configured
+ * @param[in] rxcount -  how many clocks until reading data from the PCM bus
+ * @param[in] txcount -  how many clocks until writing data to the PCM bus.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @sa Vdaa_PCMSetup Vdaa_PCMStart
+ */
+
+int Vdaa_PCMTimeSlotSetup (vdaaChanType *pVdaa, uInt16 rxcount, uInt16 txcount);
+
+/**
+ * @brief
+ *  This enables PCM transfer on the given ProSLIC channel.
+ *
+ * @param[in] pVdaa - - which channel should be enabled
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @sa ProSLIC_PCMSetup ProSLIC_PCMTimeSlotSetup ProSLIC_PCMStop
+ */
+
+int Vdaa_PCMStart (vdaaChanType *pVdaa);
+
+/**
+ * @brief
+ *  This disables PCM transfer on the given VDAA channel. Typically, this is called for debugging
+ *  purposes only.
+ *
+ * @param[in] pVdaa - - which channel should be disabled
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ * @sa Vdaa_PCMSetup Vdaa_PCMTimeSlotSetup Vdaa_PCMStart
+ */
+
+int Vdaa_PCMStop (vdaaChanType *pVdaa);
+
+/**
+ * @brief
+ * Program desired mute mode for the given channel.
+ *
+ * @param[in] pVdaa - which channel should be modified
+ * @param[in] mute - what is the desired mode.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ */
+
+int Vdaa_SetAudioMute(vdaaChanType *pVdaa, tMUTE mute);
+
+/**
+ * @brief
+ * Program desired loopback test mode for the given channel.
+ *
+ * @param[in] pVdaa -  which channel should be modified
+ * @param[in] lpbk_mode - what is the desired loopback mode.
+ * @param[in] lpbk_status - is this to enable or disable the loopback mode.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ */
+
+int Vdaa_SetLoopbackMode(vdaaChanType_ptr pVdaa, tLpbkMode lpbk_mode,
+                         tLpbkStatus lpbk_status);
+
+/*****************************************************************************/
+/** @} VDAA_AUDIO */
+/** @} */
+/** @defgroup VDAA_RING Ring detection
+ * @{
+ */
+
+/**
+ * @brief This function configures ringing detect for the Vdaa.
+ * @param[in] pVdaa - which channel to program
+ * @param[in] preset - Index of predefined ring detect setup configuration
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int Vdaa_RingDetectSetup (vdaaChanType *pVdaa,int32 preset);
+
+
+/**
+ * @brief This function reads ring detect/hook status and populates the structure passed via pStatus.
+ * @param[in] pVdaa - Pointer to Voice DAA channel structure
+ * @param[out] pStatus - updated ring status.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int Vdaa_ReadRingDetectStatus (vdaaChanType *pVdaa,
+                               vdaaRingDetectStatusType *pStatus);
+
+/** @} VDAA_RING */
+
+/*****************************************************************************/
+/** @defgroup VDAA_LINE_STATE Line state
+ * @{
+ */
+
+
+/**
+ * @brief This function sets the Voice DAA hook status
+ * @param[in]  pVdaa - Pointer to Voice DAA channel structure
+ * @param[in]  newHookStatus - new hook state (VDAA_ONHOOK, VDAA_OFFHOOK, VDAA_DIG_LOOPBACK or VDAA_ONHOOK_MONITOR)
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int Vdaa_SetHookStatus (vdaaChanType *pVdaa,uInt8 newHookStatus);
+
+/**
+ * @brief This function powers up the Voice DAA lineside device.
+ * @param[in]  pVdaa - Pointer to Voice DAA channel structure
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int Vdaa_PowerupLineside(vdaaChanType_ptr pVdaa);
+
+/**
+ * @brief This function powers down the Voice DAA line side device.
+ * @param[in]  pVdaa - Pointer to Voice DAA channel structure
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int Vdaa_PowerdownLineside(vdaaChanType_ptr pVdaa);
+
+/**
+ * @brief Read VDAA Hook Status
+ * @param[in] pVdaa - which channel to return the hook status.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+uInt8 Vdaa_GetHookStatus (vdaaChanType *pVdaa);
+
+/** @} VDAA_LINE_STATE */
+
+/*****************************************************************************/
+/** @defgroup VDAA_DIAG Diagnostics
+ * @{
+ */
+
+/**
+ * @brief This function returns the Voice DAA linefeed status.
+ * @param[in] pVdaa - Pointer to Voice DAA channel structure
+ * @param[in,out] vloop - Pointer to loop voltage variable (set by this function) - in Volts
+ * @param[in,out] iloop - Pointer to loop current variable (set by this function) - in mA
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int Vdaa_ReadLinefeedStatus (vdaaChanType *pVdaa,int8 *vloop, int16 *iloop);
+
+/**
+ * @brief This function initializes the vdaa_LIU_Config datastructure for line in use feature
+ * @param[in,out] liuCfg - Pointer to vdaa_LIU_Config structure (user allocates)
+ * @param[in] minOnV - minimum onhook loop voltage that indicates no parallel handset is present (V)
+ * @param[in] minOffV - minimum offhook loop voltage that indicates no parallel handset is present (V)
+ * @param[in] minOffI - minimum offhook loop current that indicates no parallel handset is preset (mA)
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ * @sa Vdaa_CheckForLineInUse
+ */
+
+int Vdaa_InitLineInUseCheck(vdaa_LIU_Config *liuCfg,int8 minOnV,int8 minOffV,
+                            int16 minOffI );
+
+/**
+ * @brief Monitor LVCS to detect intrusion or parallel handset
+ * @param[in] pVdaa - Pointer to Voice DAA channel structure
+ * @param[in,out] liuCfg - Pointer to vdaa_LIU_Config structure
+ * @retval VDAA_ONHOOK or VDAA_OFFHOOK (in use)
+ * @sa Vdaa_InitLineInUseCheck
+ */
+
+uInt8 Vdaa_CheckForLineInUse(vdaaChanType *pVdaa, vdaa_LIU_Config *liuCfg);
+
+/**
+ * @brief This function returns the status of the Frame Detect (FDT) bit.
+ * @param[in] pVdaa - Pointer to Voice DAA channel structure
+ * @retval int - 0 - Frame NOT detected, 1 = Frame detected
+ */
+
+int Vdaa_ReadFDTStatus(vdaaChanType_ptr pVdaa);
+
+/** @} VDAA_DIAG */
+
+/*****************************************************************************/
+/** @defgroup VDAA_INTERRUPTS Interrupts
+ * @{
+ */
+
+
+/**
+ * @brief Enables interrupts based on passed 9-bit bitmask.  Bit values defined by vdaaIntMask enum.
+ * @param[in] pVdaa - Pointer to Voice DAA channel structure
+ * @param[in] bitmask - a logical or of @ref vdaaIntMask enum
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int Vdaa_SetInterruptMask(vdaaChanType *pVdaa, vdaaIntMask bitmask);
+
+/**
+ * @brief Returns the current interrupt status.
+ * @param[in] pVdaa - Pointer to Voice DAA channel structure
+ * @param[out]  pIntData - interrupt mask showing which interrupts are set.
+ * @retval int - the number of interrupts set or RC_IGNORE
+ */
+
+int Vdaa_GetInterrupts (vdaaChanType *pVdaa,vdaaIntType *pIntData);
+
+/**
+ * @brief Clears ALL interrupts
+ * @param[in] pVdaa - Pointer to Voice DAA channel structure
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int Vdaa_ClearInterrupts (vdaaChanType *pVdaa);
+
+/** @} VDAA_INTERRUPTS */
+
+/*****************************************************************************/
+/** @defgroup VDAA_INIT Initialization
+ * @{
+ */
+
+/*****************************************************************************/
+/** @defgroup VDAA_HW_INIT Hardware/line initialization
+ * @{
+ */
+
+/**
+ * @brief
+ *  This function configures the Voice DAA with a predefined country configuration preset.
+ *
+ * @param[in] pVdaa - which channel to initialize
+ * @param[in] preset - The preset to use to configure the VDAA with.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ */
+
+int Vdaa_CountrySetup (vdaaChanType *pVdaa,int32 preset);
+
+/**
+ * @brief
+ *  This function configures the Voice DAA digital hybrid with a predefined preset.
+ *
+ * @param[in] pVdaa - which channel to initialize
+ * @param[in] preset - Index of predefined digital hybrid preset
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ * @sa Vdaa_SetHybridEnable
+ */
+
+int Vdaa_HybridSetup (vdaaChanType *pVdaa,int32 preset);
+
+/**
+ * @brief
+ *  This function fully initializes and loads the general config parameters to all Vdaa devices
+ *  a given daisychain up to a given number.
+ *
+ * @param[in] pVdaa - which channel to initialize or start from if size>1
+ * @param[in] size - the number of channels to initialize, should be at least 1
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ */
+
+int Vdaa_Init (vdaaChanType_ptr *pVdaa,int size);
+
+/**
+ * @brief
+ *  This function calibrates the ADC (analog to digital converter) of the Vdaa device(s).
+ *
+ * @param[in] pVdaa - which channel to calibrate or starting channel if size>1
+ * @param[in] size - the number of channels to calibrate.
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ */
+
+int Vdaa_ADCCal (vdaaChanType_ptr pVdaa, int32 size);
+
+/**
+ * @brief
+ *  This function controls the Voice DAA digital hybrid.
+ *
+ * @param[in] pVdaa - which channel to set/unset
+ * @param[in] enable - TRUE: enable digital hybrid, FALSE: disable digital hybrid
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ *
+ */
+
+int Vdaa_SetHybridEnable(vdaaChanType_ptr pVdaa, int enable);
+
+/** @} VDAA_HW_INIT */
+/*****************************************************************************/
+
+
+/**
+ * @brief  Enables watchdog timer
+ * @param[in] pVdaa - the channel to enable the watchdog
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int Vdaa_EnableWatchdog(vdaaChanType_ptr pVdaa);
+
+/**
+ * @brief Execute a soft reset on a given channel.
+ * @param[in] pVdaa - the channel to reset
+ * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
+ */
+
+int Vdaa_SoftReset(vdaaChanType_ptr pVdaa);/** @} VDAA_INIT */
+
+/** @} MISC */
+
+/** @} VDAA_API */
+#endif
+
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/inc/vdaa_registers.h b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/inc/vdaa_registers.h
new file mode 100644
index 0000000..2d48e3d
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/inc/vdaa_registers.h
@@ -0,0 +1,84 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Author(s):
+ * laj
+ *
+ * Distributed by:
+ * Silicon Laboratories, Inc
+ *
+ * This file contains proprietary information.
+ * No dissemination allowed without prior written permission from
+ * Silicon Laboratories, Inc.
+ *
+ */
+
+#ifndef SI3050REGS_H
+#define SI3050REGS_H
+
+
+enum REGISTERS
+{
+  CTRL1               =  1, /*  Control    */
+  CTRL2               =  2, /*  Control  */
+  INTE_MSK            =  3, /*  Interrupt Mask  */
+  INTE_SRC            =  4, /*  Interrupt Source  */
+  DAA_CTRL1           =  5, /*  DAA Control 1   */
+  DAA_CTRL2           =  6, /*  DAA Control 2   */
+  SMPL_CTRL           =  7, /*  Sample Rate Control  */
+  RESVD8              =  8, /*  Reserved  */
+  RESVD9              =  9, /*  Reserved  */
+  DAA_CTRL3           =  10, /*  DAA Control 3  */
+  SYS_LINE_DEV_REV    =  11, /*  System- and Line-Side Device Revision  */
+  LSIDE_STAT          =  12, /*  Line-Side Device Status   */
+  LSIDE_REV           =  13, /*  Line-Side Device Revision   */
+  DAA_CTRL4           =  14, /*  DAA Control 4 RPOL  */
+  TXRX_GN_CTRL        =  15, /*  TX/RX Gain Control 1  */
+  INTL_CTRL1          =  16, /*  International Control 1   */
+  INTL_CTRL2          =  17, /*  International Control 2   */
+  INTL_CTRL3          =  18, /*  International Control 3   */
+  INTL_CTRL4          =  19, /*  International Control 4   */
+  RXCALL_PROG_ATTEN   =  20, /*  Call Progress RX Attenuation  */
+  TXCALL_PROG_ATTEN   =  21, /*  Call Progress TX Attenuation   */
+  RNG_VLD_CTRL1       =  22, /*  Ring Validation Control 1   */
+  RNG_VLD_CTRL2       =  23, /*  Ring Validation Control 2   */
+  RNG_VLD_CTRL3       =  24, /*  ing Validation Control 3   */
+  RES_CALIB           =  25, /*  Resistor Calibration   */
+  DC_TERM_CTRL        =  26, /*  DC Termination Control   */
+  RESVD27             =  27, /*  Reserved  */
+  LP_CRNT_STAT        =  28, /*  Loop Current Status  */
+  LINE_VOLT_STAT      =  29, /*  Line Voltage Status   */
+  AC_TERM_CTRL        =  30, /*  AC Termination Control   */
+  DAA_CTRL5           =  31, /*  DAA Control 5   */
+  GND_STRT_CTRL       =  32, /*  Ground Start Control  */
+  PCM_SPI_CTRL        =  33, /*  PCM/SPI Mode Select   */
+  PCMTX_CNT_LO        =  34, /*  PCM Transmit Start Count - Low Byte  */
+  PCMTX_CNT_HI        =  35, /*  PCM Transmit Start Count - High Byte   */
+  PCMRX_CNT_LO        =  36, /*  PCM Receive Start Count - Low Byte   */
+  PCMRX_CNT_HI        =  37, /*  PCM Receive Start Count - High Byte   */
+  TX_GN_CTRL2         =  38, /*  TX Gain Control 2   */
+  RX_GN_CTRL2         =  39, /*  RX Gain Control 2   */
+  TX_GN_CTRL3         =  40, /*  TX Gain Control 3   */
+  RX_GN_CTRL3         =  41, /*  RX Gain Control 3   */
+  GCI_CTRL            =  42, /*  GCI Control   */
+  LN_VI_THRESH_INTE   =  43, /*  Line Current/Voltage Threshold Interrupt  */
+  LN_VI_THRESH_INTE_CTRL=44, /*  Line Current/Voltage Threshold Interrupt Control  */
+  HYB1                =  45, /*  Programmable Hybrid Register 1  */
+  HYB2                =  46, /*  Programmable Hybrid Register 2  */
+  HYB3                =  47, /*  Programmable Hybrid Register 3  */
+  HYB4                =  48, /*  Programmable Hybrid Register 4  */
+  HYB5                =  49, /*  Programmable Hybrid Register 5  */
+  HYB6                =  50, /*  Programmable Hybrid Register 6  */
+  HYB7                =  51, /*  Programmable Hybrid Register 7  */
+  HYB8                =  52, /*  Programmable Hybrid Register 8  */
+  RESVD53             =  53, /*  Reserved 53  */
+  RESVD54             =  54, /*  Reserved 54  */
+  RESVD55             =  55, /*  Reserved 55  */
+  RESVD56             =  56, /*  Reserved 56  */
+  RESVD57             =  57, /*  Reserved 57  */
+  RESVD58             =  58, /*  Reserved 58  */
+  SPRK_QNCH_CTRL      =  59    /*  Spark Quenching Control  */
+
+};
+
+#endif
+
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/mipsregs.h b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/mipsregs.h
new file mode 100644
index 0000000..b4d10e9
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/mipsregs.h
@@ -0,0 +1,1473 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _ASM_MIPSREGS_H
+#define _ASM_MIPSREGS_H
+
+//#include <linux/linkage.h>
+//#include <asm/hazards.h>
+#define CONFIG_PAGE_SIZE_4KB
+/*
+ * The following macros are especially useful for __asm__
+ * inline assembler.
+ */
+#ifndef __STR
+#define __STR(x) #x
+#endif
+#ifndef STR
+#define STR(x) __STR(x)
+#endif
+
+/*
+ *  Configure language
+ */
+#ifdef __ASSEMBLY__
+#define _ULCAST_
+#else
+#define _ULCAST_ (unsigned long)
+#endif
+
+/*
+ * Coprocessor 0 register names
+ */
+#define CP0_INDEX $0
+#define CP0_RANDOM $1
+#define CP0_ENTRYLO0 $2
+#define CP0_ENTRYLO1 $3
+#define CP0_CONF $3
+#define CP0_CONTEXT $4
+#define CP0_PAGEMASK $5
+#define CP0_WIRED $6
+#define CP0_INFO $7
+#define CP0_BADVADDR $8
+#define CP0_COUNT $9
+#define CP0_ENTRYHI $10
+#define CP0_COMPARE $11
+#define CP0_STATUS $12
+#define CP0_CAUSE $13
+#define CP0_EPC $14
+#define CP0_PRID $15
+#define CP0_CONFIG $16
+#define CP0_LLADDR $17
+#define CP0_WATCHLO $18
+#define CP0_WATCHHI $19
+#define CP0_XCONTEXT $20
+#define CP0_FRAMEMASK $21
+#define CP0_DIAGNOSTIC $22
+#define CP0_DEBUG $23
+#define CP0_DEPC $24
+#define CP0_PERFORMANCE $25
+#define CP0_ECC $26
+#define CP0_CACHEERR $27
+#define CP0_TAGLO $28
+#define CP0_TAGHI $29
+#define CP0_ERROREPC $30
+#define CP0_DESAVE $31
+
+/*
+ * R4640/R4650 cp0 register names.  These registers are listed
+ * here only for completeness; without MMU these CPUs are not useable
+ * by Linux.  A future ELKS port might take make Linux run on them
+ * though ...
+ */
+#define CP0_IBASE $0
+#define CP0_IBOUND $1
+#define CP0_DBASE $2
+#define CP0_DBOUND $3
+#define CP0_CALG $17
+#define CP0_IWATCH $18
+#define CP0_DWATCH $19
+
+/*
+ * Coprocessor 0 Set 1 register names
+ */
+#define CP0_S1_DERRADDR0  $26
+#define CP0_S1_DERRADDR1  $27
+#define CP0_S1_INTCONTROL $20
+
+/*
+ * Coprocessor 0 Set 2 register names
+ */
+#define CP0_S2_SRSCTL	  $12	/* MIPSR2 */
+
+/*
+ * Coprocessor 0 Set 3 register names
+ */
+#define CP0_S3_SRSMAP	  $12	/* MIPSR2 */
+
+/*
+ *  TX39 Series
+ */
+#define CP0_TX39_CACHE	$7
+
+/*
+ * Coprocessor 1 (FPU) register names
+ */
+#define CP1_REVISION   $0
+#define CP1_STATUS     $31
+
+/*
+ * FPU Status Register Values
+ */
+/*
+ * Status Register Values
+ */
+
+#define FPU_CSR_FLUSH   0x01000000      /* flush denormalised results to 0 */
+#define FPU_CSR_COND    0x00800000      /* $fcc0 */
+#define FPU_CSR_COND0   0x00800000      /* $fcc0 */
+#define FPU_CSR_COND1   0x02000000      /* $fcc1 */
+#define FPU_CSR_COND2   0x04000000      /* $fcc2 */
+#define FPU_CSR_COND3   0x08000000      /* $fcc3 */
+#define FPU_CSR_COND4   0x10000000      /* $fcc4 */
+#define FPU_CSR_COND5   0x20000000      /* $fcc5 */
+#define FPU_CSR_COND6   0x40000000      /* $fcc6 */
+#define FPU_CSR_COND7   0x80000000      /* $fcc7 */
+
+/*
+ * X the exception cause indicator
+ * E the exception enable
+ * S the sticky/flag bit
+*/
+#define FPU_CSR_ALL_X   0x0003f000
+#define FPU_CSR_UNI_X   0x00020000
+#define FPU_CSR_INV_X   0x00010000
+#define FPU_CSR_DIV_X   0x00008000
+#define FPU_CSR_OVF_X   0x00004000
+#define FPU_CSR_UDF_X   0x00002000
+#define FPU_CSR_INE_X   0x00001000
+
+#define FPU_CSR_ALL_E   0x00000f80
+#define FPU_CSR_INV_E   0x00000800
+#define FPU_CSR_DIV_E   0x00000400
+#define FPU_CSR_OVF_E   0x00000200
+#define FPU_CSR_UDF_E   0x00000100
+#define FPU_CSR_INE_E   0x00000080
+
+#define FPU_CSR_ALL_S   0x0000007c
+#define FPU_CSR_INV_S   0x00000040
+#define FPU_CSR_DIV_S   0x00000020
+#define FPU_CSR_OVF_S   0x00000010
+#define FPU_CSR_UDF_S   0x00000008
+#define FPU_CSR_INE_S   0x00000004
+
+/* rounding mode */
+#define FPU_CSR_RN      0x0     /* nearest */
+#define FPU_CSR_RZ      0x1     /* towards zero */
+#define FPU_CSR_RU      0x2     /* towards +Infinity */
+#define FPU_CSR_RD      0x3     /* towards -Infinity */
+
+
+/*
+ * Values for PageMask register
+ */
+#ifdef CONFIG_CPU_VR41XX
+
+/* Why doesn't stupidity hurt ... */
+
+#define PM_1K		0x00000000
+#define PM_4K		0x00001800
+#define PM_16K		0x00007800
+#define PM_64K		0x0001f800
+#define PM_256K		0x0007f800
+
+#else
+
+#define PM_4K		0x00000000
+#define PM_16K		0x00006000
+#define PM_64K		0x0001e000
+#define PM_256K		0x0007e000
+#define PM_1M		0x001fe000
+#define PM_4M		0x007fe000
+#define PM_16M		0x01ffe000
+#define PM_64M		0x07ffe000
+#define PM_256M		0x1fffe000
+
+#endif
+
+/*
+ * Default page size for a given kernel configuration
+ */
+#ifdef CONFIG_PAGE_SIZE_4KB
+#define PM_DEFAULT_MASK	PM_4K
+#elif defined(CONFIG_PAGE_SIZE_16KB)
+#define PM_DEFAULT_MASK	PM_16K
+#elif defined(CONFIG_PAGE_SIZE_64KB)
+#define PM_DEFAULT_MASK	PM_64K
+#else
+#error Bad page size configuration!
+#endif
+
+
+/*
+ * Values used for computation of new tlb entries
+ */
+#define PL_4K		12
+#define PL_16K		14
+#define PL_64K		16
+#define PL_256K		18
+#define PL_1M		20
+#define PL_4M		22
+#define PL_16M		24
+#define PL_64M		26
+#define PL_256M		28
+
+/*
+ * R4x00 interrupt enable / cause bits
+ */
+#define IE_SW0          (_ULCAST_(1) <<  8)
+#define IE_SW1          (_ULCAST_(1) <<  9)
+#define IE_IRQ0         (_ULCAST_(1) << 10)
+#define IE_IRQ1         (_ULCAST_(1) << 11)
+#define IE_IRQ2         (_ULCAST_(1) << 12)
+#define IE_IRQ3         (_ULCAST_(1) << 13)
+#define IE_IRQ4         (_ULCAST_(1) << 14)
+#define IE_IRQ5         (_ULCAST_(1) << 15)
+
+/*
+ * R4x00 interrupt cause bits
+ */
+#define C_SW0           (_ULCAST_(1) <<  8)
+#define C_SW1           (_ULCAST_(1) <<  9)
+#define C_IRQ0          (_ULCAST_(1) << 10)
+#define C_IRQ1          (_ULCAST_(1) << 11)
+#define C_IRQ2          (_ULCAST_(1) << 12)
+#define C_IRQ3          (_ULCAST_(1) << 13)
+#define C_IRQ4          (_ULCAST_(1) << 14)
+#define C_IRQ5          (_ULCAST_(1) << 15)
+
+/*
+ * Bitfields in the R4xx0 cp0 status register
+ */
+#define ST0_IE			0x00000001
+#define ST0_EXL			0x00000002
+#define ST0_ERL			0x00000004
+#define ST0_KSU			0x00000018
+#  define KSU_USER		0x00000010
+#  define KSU_SUPERVISOR	0x00000008
+#  define KSU_KERNEL		0x00000000
+#define ST0_UX			0x00000020
+#define ST0_SX			0x00000040
+#define ST0_KX 			0x00000080
+#define ST0_DE			0x00010000
+#define ST0_CE			0x00020000
+
+/*
+ * Setting c0_status.co enables Hit_Writeback and Hit_Writeback_Invalidate
+ * cacheops in userspace.  This bit exists only on RM7000 and RM9000
+ * processors.
+ */
+#define ST0_CO			0x08000000
+
+/*
+ * Bitfields in the R[23]000 cp0 status register.
+ */
+#define ST0_IEC                 0x00000001
+#define ST0_KUC			0x00000002
+#define ST0_IEP			0x00000004
+#define ST0_KUP			0x00000008
+#define ST0_IEO			0x00000010
+#define ST0_KUO			0x00000020
+/* bits 6 & 7 are reserved on R[23]000 */
+#define ST0_ISC			0x00010000
+#define ST0_SWC			0x00020000
+#define ST0_CM			0x00080000
+
+/*
+ * Bits specific to the R4640/R4650
+ */
+#define ST0_UM			(_ULCAST_(1) <<  4)
+#define ST0_IL			(_ULCAST_(1) << 23)
+#define ST0_DL			(_ULCAST_(1) << 24)
+
+/*
+ * Enable the MIPS MDMX and DSP ASEs
+ */
+#define ST0_MX			0x01000000
+
+/*
+ * Bitfields in the TX39 family CP0 Configuration Register 3
+ */
+#define TX39_CONF_ICS_SHIFT	19
+#define TX39_CONF_ICS_MASK	0x00380000
+#define TX39_CONF_ICS_1KB 	0x00000000
+#define TX39_CONF_ICS_2KB 	0x00080000
+#define TX39_CONF_ICS_4KB 	0x00100000
+#define TX39_CONF_ICS_8KB 	0x00180000
+#define TX39_CONF_ICS_16KB 	0x00200000
+
+#define TX39_CONF_DCS_SHIFT	16
+#define TX39_CONF_DCS_MASK	0x00070000
+#define TX39_CONF_DCS_1KB 	0x00000000
+#define TX39_CONF_DCS_2KB 	0x00010000
+#define TX39_CONF_DCS_4KB 	0x00020000
+#define TX39_CONF_DCS_8KB 	0x00030000
+#define TX39_CONF_DCS_16KB 	0x00040000
+
+#define TX39_CONF_CWFON 	0x00004000
+#define TX39_CONF_WBON  	0x00002000
+#define TX39_CONF_RF_SHIFT	10
+#define TX39_CONF_RF_MASK	0x00000c00
+#define TX39_CONF_DOZE		0x00000200
+#define TX39_CONF_HALT		0x00000100
+#define TX39_CONF_LOCK		0x00000080
+#define TX39_CONF_ICE		0x00000020
+#define TX39_CONF_DCE		0x00000010
+#define TX39_CONF_IRSIZE_SHIFT	2
+#define TX39_CONF_IRSIZE_MASK	0x0000000c
+#define TX39_CONF_DRSIZE_SHIFT	0
+#define TX39_CONF_DRSIZE_MASK	0x00000003
+
+/*
+ * Status register bits available in all MIPS CPUs.
+ */
+#define ST0_IM			0x0000ff00
+#define  STATUSB_IP0		8
+#define  STATUSF_IP0		(_ULCAST_(1) <<  8)
+#define  STATUSB_IP1		9
+#define  STATUSF_IP1		(_ULCAST_(1) <<  9)
+#define  STATUSB_IP2		10
+#define  STATUSF_IP2		(_ULCAST_(1) << 10)
+#define  STATUSB_IP3		11
+#define  STATUSF_IP3		(_ULCAST_(1) << 11)
+#define  STATUSB_IP4		12
+#define  STATUSF_IP4		(_ULCAST_(1) << 12)
+#define  STATUSB_IP5		13
+#define  STATUSF_IP5		(_ULCAST_(1) << 13)
+#define  STATUSB_IP6		14
+#define  STATUSF_IP6		(_ULCAST_(1) << 14)
+#define  STATUSB_IP7		15
+#define  STATUSF_IP7		(_ULCAST_(1) << 15)
+#define  STATUSB_IP8		0
+#define  STATUSF_IP8		(_ULCAST_(1) <<  0)
+#define  STATUSB_IP9		1
+#define  STATUSF_IP9		(_ULCAST_(1) <<  1)
+#define  STATUSB_IP10		2
+#define  STATUSF_IP10		(_ULCAST_(1) <<  2)
+#define  STATUSB_IP11		3
+#define  STATUSF_IP11		(_ULCAST_(1) <<  3)
+#define  STATUSB_IP12		4
+#define  STATUSF_IP12		(_ULCAST_(1) <<  4)
+#define  STATUSB_IP13		5
+#define  STATUSF_IP13		(_ULCAST_(1) <<  5)
+#define  STATUSB_IP14		6
+#define  STATUSF_IP14		(_ULCAST_(1) <<  6)
+#define  STATUSB_IP15		7
+#define  STATUSF_IP15		(_ULCAST_(1) <<  7)
+#define ST0_CH			0x00040000
+#define ST0_SR			0x00100000
+#define ST0_TS			0x00200000
+#define ST0_BEV			0x00400000
+#define ST0_RE			0x02000000
+#define ST0_FR			0x04000000
+#define ST0_CU			0xf0000000
+#define ST0_CU0			0x10000000
+#define ST0_CU1			0x20000000
+#define ST0_CU2			0x40000000
+#define ST0_CU3			0x80000000
+#define ST0_XX			0x80000000	/* MIPS IV naming */
+
+/*
+ * Bitfields and bit numbers in the coprocessor 0 cause register.
+ *
+ * Refer to your MIPS R4xx0 manual, chapter 5 for explanation.
+ */
+#define  CAUSEB_EXCCODE		2
+#define  CAUSEF_EXCCODE		(_ULCAST_(31)  <<  2)
+#define  CAUSEB_IP		8
+#define  CAUSEF_IP		(_ULCAST_(255) <<  8)
+#define  CAUSEB_IP0		8
+#define  CAUSEF_IP0		(_ULCAST_(1)   <<  8)
+#define  CAUSEB_IP1		9
+#define  CAUSEF_IP1		(_ULCAST_(1)   <<  9)
+#define  CAUSEB_IP2		10
+#define  CAUSEF_IP2		(_ULCAST_(1)   << 10)
+#define  CAUSEB_IP3		11
+#define  CAUSEF_IP3		(_ULCAST_(1)   << 11)
+#define  CAUSEB_IP4		12
+#define  CAUSEF_IP4		(_ULCAST_(1)   << 12)
+#define  CAUSEB_IP5		13
+#define  CAUSEF_IP5		(_ULCAST_(1)   << 13)
+#define  CAUSEB_IP6		14
+#define  CAUSEF_IP6		(_ULCAST_(1)   << 14)
+#define  CAUSEB_IP7		15
+#define  CAUSEF_IP7		(_ULCAST_(1)   << 15)
+#define  CAUSEB_IV		23
+#define  CAUSEF_IV		(_ULCAST_(1)   << 23)
+#define  CAUSEB_CE		28
+#define  CAUSEF_CE		(_ULCAST_(3)   << 28)
+#define  CAUSEB_BD		31
+#define  CAUSEF_BD		(_ULCAST_(1)   << 31)
+
+/*
+ * Bits in the coprocessor 0 config register.
+ */
+/* Generic bits.  */
+#define CONF_CM_CACHABLE_NO_WA		0
+#define CONF_CM_CACHABLE_WA		1
+#define CONF_CM_UNCACHED		2
+#define CONF_CM_CACHABLE_NONCOHERENT	3
+#define CONF_CM_CACHABLE_CE		4
+#define CONF_CM_CACHABLE_COW		5
+#define CONF_CM_CACHABLE_CUW		6
+#define CONF_CM_CACHABLE_ACCELERATED	7
+#define CONF_CM_CMASK			7
+#define CONF_BE			(_ULCAST_(1) << 15)
+
+/* Bits common to various processors.  */
+#define CONF_CU			(_ULCAST_(1) <<  3)
+#define CONF_DB			(_ULCAST_(1) <<  4)
+#define CONF_IB			(_ULCAST_(1) <<  5)
+#define CONF_DC			(_ULCAST_(7) <<  6)
+#define CONF_IC			(_ULCAST_(7) <<  9)
+#define CONF_EB			(_ULCAST_(1) << 13)
+#define CONF_EM			(_ULCAST_(1) << 14)
+#define CONF_SM			(_ULCAST_(1) << 16)
+#define CONF_SC			(_ULCAST_(1) << 17)
+#define CONF_EW			(_ULCAST_(3) << 18)
+#define CONF_EP			(_ULCAST_(15)<< 24)
+#define CONF_EC			(_ULCAST_(7) << 28)
+#define CONF_CM			(_ULCAST_(1) << 31)
+
+/* Bits specific to the R4xx0.  */
+#define R4K_CONF_SW		(_ULCAST_(1) << 20)
+#define R4K_CONF_SS		(_ULCAST_(1) << 21)
+#define R4K_CONF_SB		(_ULCAST_(3) << 22)
+
+/* Bits specific to the R5000.  */
+#define R5K_CONF_SE		(_ULCAST_(1) << 12)
+#define R5K_CONF_SS		(_ULCAST_(3) << 20)
+
+/* Bits specific to the RM7000.  */
+#define RM7K_CONF_SE		(_ULCAST_(1) <<  3)
+#define RM7K_CONF_TE		(_ULCAST_(1) << 12)
+#define RM7K_CONF_CLK		(_ULCAST_(1) << 16)
+#define RM7K_CONF_TC		(_ULCAST_(1) << 17)
+#define RM7K_CONF_SI		(_ULCAST_(3) << 20)
+#define RM7K_CONF_SC		(_ULCAST_(1) << 31)
+
+/* Bits specific to the R10000.  */
+#define R10K_CONF_DN		(_ULCAST_(3) <<  3)
+#define R10K_CONF_CT		(_ULCAST_(1) <<  5)
+#define R10K_CONF_PE		(_ULCAST_(1) <<  6)
+#define R10K_CONF_PM		(_ULCAST_(3) <<  7)
+#define R10K_CONF_EC		(_ULCAST_(15)<<  9)
+#define R10K_CONF_SB		(_ULCAST_(1) << 13)
+#define R10K_CONF_SK		(_ULCAST_(1) << 14)
+#define R10K_CONF_SS		(_ULCAST_(7) << 16)
+#define R10K_CONF_SC		(_ULCAST_(7) << 19)
+#define R10K_CONF_DC		(_ULCAST_(7) << 26)
+#define R10K_CONF_IC		(_ULCAST_(7) << 29)
+
+/* Bits specific to the VR41xx.  */
+#define VR41_CONF_CS		(_ULCAST_(1) << 12)
+#define VR41_CONF_P4K		(_ULCAST_(1) << 13)
+#define VR41_CONF_BP		(_ULCAST_(1) << 16)
+#define VR41_CONF_M16		(_ULCAST_(1) << 20)
+#define VR41_CONF_AD		(_ULCAST_(1) << 23)
+
+/* Bits specific to the R30xx.  */
+#define R30XX_CONF_FDM		(_ULCAST_(1) << 19)
+#define R30XX_CONF_REV		(_ULCAST_(1) << 22)
+#define R30XX_CONF_AC		(_ULCAST_(1) << 23)
+#define R30XX_CONF_RF		(_ULCAST_(1) << 24)
+#define R30XX_CONF_HALT		(_ULCAST_(1) << 25)
+#define R30XX_CONF_FPINT	(_ULCAST_(7) << 26)
+#define R30XX_CONF_DBR		(_ULCAST_(1) << 29)
+#define R30XX_CONF_SB		(_ULCAST_(1) << 30)
+#define R30XX_CONF_LOCK		(_ULCAST_(1) << 31)
+
+/* Bits specific to the TX49.  */
+#define TX49_CONF_DC		(_ULCAST_(1) << 16)
+#define TX49_CONF_IC		(_ULCAST_(1) << 17)  /* conflict with CONF_SC */
+#define TX49_CONF_HALT		(_ULCAST_(1) << 18)
+#define TX49_CONF_CWFON		(_ULCAST_(1) << 27)
+
+/* Bits specific to the MIPS32/64 PRA.  */
+#define MIPS_CONF_MT		(_ULCAST_(7) <<  7)
+#define MIPS_CONF_AR		(_ULCAST_(7) << 10)
+#define MIPS_CONF_AT		(_ULCAST_(3) << 13)
+#define MIPS_CONF_M		(_ULCAST_(1) << 31)
+
+/*
+ * Bits in the MIPS32/64 PRA coprocessor 0 config registers 1 and above.
+ */
+#define MIPS_CONF1_FP		(_ULCAST_(1) <<  0)
+#define MIPS_CONF1_EP		(_ULCAST_(1) <<  1)
+#define MIPS_CONF1_CA		(_ULCAST_(1) <<  2)
+#define MIPS_CONF1_WR		(_ULCAST_(1) <<  3)
+#define MIPS_CONF1_PC		(_ULCAST_(1) <<  4)
+#define MIPS_CONF1_MD		(_ULCAST_(1) <<  5)
+#define MIPS_CONF1_C2		(_ULCAST_(1) <<  6)
+#define MIPS_CONF1_DA		(_ULCAST_(7) <<  7)
+#define MIPS_CONF1_DL		(_ULCAST_(7) << 10)
+#define MIPS_CONF1_DS		(_ULCAST_(7) << 13)
+#define MIPS_CONF1_IA		(_ULCAST_(7) << 16)
+#define MIPS_CONF1_IL		(_ULCAST_(7) << 19)
+#define MIPS_CONF1_IS		(_ULCAST_(7) << 22)
+#define MIPS_CONF1_TLBS		(_ULCAST_(63)<< 25)
+
+#define MIPS_CONF2_SA		(_ULCAST_(15)<<  0)
+#define MIPS_CONF2_SL		(_ULCAST_(15)<<  4)
+#define MIPS_CONF2_SS		(_ULCAST_(15)<<  8)
+#define MIPS_CONF2_SU		(_ULCAST_(15)<< 12)
+#define MIPS_CONF2_TA		(_ULCAST_(15)<< 16)
+#define MIPS_CONF2_TL		(_ULCAST_(15)<< 20)
+#define MIPS_CONF2_TS		(_ULCAST_(15)<< 24)
+#define MIPS_CONF2_TU		(_ULCAST_(7) << 28)
+
+#define MIPS_CONF3_TL		(_ULCAST_(1) <<  0)
+#define MIPS_CONF3_SM		(_ULCAST_(1) <<  1)
+#define MIPS_CONF3_MT		(_ULCAST_(1) <<  2)
+#define MIPS_CONF3_SP		(_ULCAST_(1) <<  4)
+#define MIPS_CONF3_VINT		(_ULCAST_(1) <<  5)
+#define MIPS_CONF3_VEIC		(_ULCAST_(1) <<  6)
+#define MIPS_CONF3_LPA		(_ULCAST_(1) <<  7)
+#define MIPS_CONF3_DSP		(_ULCAST_(1) << 10)
+
+/*
+ * Bits in the MIPS32/64 coprocessor 1 (FPU) revision register.
+ */
+#define MIPS_FPIR_S		(_ULCAST_(1) << 16)
+#define MIPS_FPIR_D		(_ULCAST_(1) << 17)
+#define MIPS_FPIR_PS		(_ULCAST_(1) << 18)
+#define MIPS_FPIR_3D		(_ULCAST_(1) << 19)
+#define MIPS_FPIR_W		(_ULCAST_(1) << 20)
+#define MIPS_FPIR_L		(_ULCAST_(1) << 21)
+#define MIPS_FPIR_F64		(_ULCAST_(1) << 22)
+
+#ifndef __ASSEMBLY__
+
+/*
+ * Functions to access the R10000 performance counters.  These are basically
+ * mfc0 and mtc0 instructions from and to coprocessor register with a 5-bit
+ * performance counter number encoded into bits 1 ... 5 of the instruction.
+ * Only performance counters 0 to 1 actually exist, so for a non-R10000 aware
+ * disassembler these will look like an access to sel 0 or 1.
+ */
+#define read_r10k_perf_cntr(counter)				\
+({								\
+	unsigned int __res;					\
+	__asm__ __volatile__(					\
+	"mfpc\t%0, %1"						\
+        : "=r" (__res)						\
+	: "i" (counter));					\
+								\
+        __res;							\
+})
+
+#define write_r10k_perf_cntr(counter,val)                       \
+do {								\
+	__asm__ __volatile__(					\
+	"mtpc\t%0, %1"						\
+	:							\
+	: "r" (val), "i" (counter));				\
+} while (0)
+
+#define read_r10k_perf_event(counter)				\
+({								\
+	unsigned int __res;					\
+	__asm__ __volatile__(					\
+	"mfps\t%0, %1"						\
+        : "=r" (__res)						\
+	: "i" (counter));					\
+								\
+        __res;							\
+})
+
+#define write_r10k_perf_cntl(counter,val)                       \
+do {								\
+	__asm__ __volatile__(					\
+	"mtps\t%0, %1"						\
+	:							\
+	: "r" (val), "i" (counter));				\
+} while (0)
+
+
+/*
+ * Macros to access the system control coprocessor
+ */
+
+#define __read_32bit_c0_register(source, sel)				\
+({ int __res;								\
+	if (sel == 0)							\
+		__asm__ __volatile__(					\
+			"mfc0\t%0, " #source "\n\t"			\
+			: "=r" (__res));				\
+	else								\
+		__asm__ __volatile__(					\
+			".set\tmips32\n\t"				\
+			"mfc0\t%0, " #source ", " #sel "\n\t"		\
+			".set\tmips0\n\t"				\
+			: "=r" (__res));				\
+	__res;								\
+})
+
+#define __read_64bit_c0_register(source, sel)				\
+({ unsigned long long __res;						\
+	if (sizeof(unsigned long) == 4)					\
+		__res = __read_64bit_c0_split(source, sel);		\
+	else if (sel == 0)						\
+		__asm__ __volatile__(					\
+			".set\tmips3\n\t"				\
+			"dmfc0\t%0, " #source "\n\t"			\
+			".set\tmips0"					\
+			: "=r" (__res));				\
+	else								\
+		__asm__ __volatile__(					\
+			".set\tmips64\n\t"				\
+			"dmfc0\t%0, " #source ", " #sel "\n\t"		\
+			".set\tmips0"					\
+			: "=r" (__res));				\
+	__res;								\
+})
+
+#define __write_32bit_c0_register(register, sel, value)			\
+do {									\
+	if (sel == 0)							\
+		__asm__ __volatile__(					\
+			"mtc0\t%z0, " #register "\n\t"			\
+			: : "Jr" ((unsigned int)(value)));		\
+	else								\
+		__asm__ __volatile__(					\
+			".set\tmips32\n\t"				\
+			"mtc0\t%z0, " #register ", " #sel "\n\t"	\
+			".set\tmips0"					\
+			: : "Jr" ((unsigned int)(value)));		\
+} while (0)
+
+#define __write_64bit_c0_register(register, sel, value)			\
+do {									\
+	if (sizeof(unsigned long) == 4)					\
+		__write_64bit_c0_split(register, sel, value);		\
+	else if (sel == 0)						\
+		__asm__ __volatile__(					\
+			".set\tmips3\n\t"				\
+			"dmtc0\t%z0, " #register "\n\t"			\
+			".set\tmips0"					\
+			: : "Jr" (value));				\
+	else								\
+		__asm__ __volatile__(					\
+			".set\tmips64\n\t"				\
+			"dmtc0\t%z0, " #register ", " #sel "\n\t"	\
+			".set\tmips0"					\
+			: : "Jr" (value));				\
+} while (0)
+
+#define __read_ulong_c0_register(reg, sel)				\
+	((sizeof(unsigned long) == 4) ?					\
+	(unsigned long) __read_32bit_c0_register(reg, sel) :		\
+	(unsigned long) __read_64bit_c0_register(reg, sel))
+
+#define __write_ulong_c0_register(reg, sel, val)			\
+do {									\
+	if (sizeof(unsigned long) == 4)					\
+		__write_32bit_c0_register(reg, sel, val);		\
+	else								\
+		__write_64bit_c0_register(reg, sel, val);		\
+} while (0)
+
+/*
+ * On RM7000/RM9000 these are uses to access cop0 set 1 registers
+ */
+#define __read_32bit_c0_ctrl_register(source)				\
+({ int __res;								\
+	__asm__ __volatile__(						\
+		"cfc0\t%0, " #source "\n\t"				\
+		: "=r" (__res));					\
+	__res;								\
+})
+
+#define __write_32bit_c0_ctrl_register(register, value)			\
+do {									\
+	__asm__ __volatile__(						\
+		"ctc0\t%z0, " #register "\n\t"				\
+		: : "Jr" ((unsigned int)(value)));			\
+} while (0)
+
+/*
+ * These versions are only needed for systems with more than 38 bits of
+ * physical address space running the 32-bit kernel.  That's none atm :-)
+ */
+#define __read_64bit_c0_split(source, sel)				\
+({									\
+	unsigned long long val;						\
+	unsigned long flags;						\
+									\
+	local_irq_save(flags);						\
+	if (sel == 0)							\
+		__asm__ __volatile__(					\
+			".set\tmips64\n\t"				\
+			"dmfc0\t%M0, " #source "\n\t"			\
+			"dsll\t%L0, %M0, 32\n\t"			\
+			"dsrl\t%M0, %M0, 32\n\t"			\
+			"dsrl\t%L0, %L0, 32\n\t"			\
+			".set\tmips0"					\
+			: "=r" (val));					\
+	else								\
+		__asm__ __volatile__(					\
+			".set\tmips64\n\t"				\
+			"dmfc0\t%M0, " #source ", " #sel "\n\t"		\
+			"dsll\t%L0, %M0, 32\n\t"			\
+			"dsrl\t%M0, %M0, 32\n\t"			\
+			"dsrl\t%L0, %L0, 32\n\t"			\
+			".set\tmips0"					\
+			: "=r" (val));					\
+	local_irq_restore(flags);					\
+									\
+	val;								\
+})
+
+#define __write_64bit_c0_split(source, sel, val)			\
+do {									\
+	unsigned long flags;						\
+									\
+	local_irq_save(flags);						\
+	if (sel == 0)							\
+		__asm__ __volatile__(					\
+			".set\tmips64\n\t"				\
+			"dsll\t%L0, %L0, 32\n\t"			\
+			"dsrl\t%L0, %L0, 32\n\t"			\
+			"dsll\t%M0, %M0, 32\n\t"			\
+			"or\t%L0, %L0, %M0\n\t"				\
+			"dmtc0\t%L0, " #source "\n\t"			\
+			".set\tmips0"					\
+			: : "r" (val));					\
+	else								\
+		__asm__ __volatile__(					\
+			".set\tmips64\n\t"				\
+			"dsll\t%L0, %L0, 32\n\t"			\
+			"dsrl\t%L0, %L0, 32\n\t"			\
+			"dsll\t%M0, %M0, 32\n\t"			\
+			"or\t%L0, %L0, %M0\n\t"				\
+			"dmtc0\t%L0, " #source ", " #sel "\n\t"		\
+			".set\tmips0"					\
+			: : "r" (val));					\
+	local_irq_restore(flags);					\
+} while (0)
+
+#define read_c0_index()		__read_32bit_c0_register($0, 0)
+#define write_c0_index(val)	__write_32bit_c0_register($0, 0, val)
+
+#define read_c0_entrylo0()	__read_ulong_c0_register($2, 0)
+#define write_c0_entrylo0(val)	__write_ulong_c0_register($2, 0, val)
+
+#define read_c0_entrylo1()	__read_ulong_c0_register($3, 0)
+#define write_c0_entrylo1(val)	__write_ulong_c0_register($3, 0, val)
+
+#define read_c0_conf()		__read_32bit_c0_register($3, 0)
+#define write_c0_conf(val)	__write_32bit_c0_register($3, 0, val)
+
+#define read_c0_context()	__read_ulong_c0_register($4, 0)
+#define write_c0_context(val)	__write_ulong_c0_register($4, 0, val)
+
+#define read_c0_pagemask()	__read_32bit_c0_register($5, 0)
+#define write_c0_pagemask(val)	__write_32bit_c0_register($5, 0, val)
+
+#define read_c0_wired()		__read_32bit_c0_register($6, 0)
+#define write_c0_wired(val)	__write_32bit_c0_register($6, 0, val)
+
+#define read_c0_info()		__read_32bit_c0_register($7, 0)
+
+#define read_c0_cache()		__read_32bit_c0_register($7, 0)	/* TX39xx */
+#define write_c0_cache(val)	__write_32bit_c0_register($7, 0, val)
+
+#define read_c0_badvaddr()	__read_ulong_c0_register($8, 0)
+#define write_c0_badvaddr(val)	__write_ulong_c0_register($8, 0, val)
+
+#define read_c0_count()		__read_32bit_c0_register($9, 0)
+#define write_c0_count(val)	__write_32bit_c0_register($9, 0, val)
+
+#define read_c0_count2()	__read_32bit_c0_register($9, 6) /* pnx8550 */
+#define write_c0_count2(val)	__write_32bit_c0_register($9, 6, val)
+
+#define read_c0_count3()	__read_32bit_c0_register($9, 7) /* pnx8550 */
+#define write_c0_count3(val)	__write_32bit_c0_register($9, 7, val)
+
+#define read_c0_entryhi()	__read_ulong_c0_register($10, 0)
+#define write_c0_entryhi(val)	__write_ulong_c0_register($10, 0, val)
+
+#define read_c0_compare()	__read_32bit_c0_register($11, 0)
+#define write_c0_compare(val)	__write_32bit_c0_register($11, 0, val)
+
+#define read_c0_compare2()	__read_32bit_c0_register($11, 6) /* pnx8550 */
+#define write_c0_compare2(val)	__write_32bit_c0_register($11, 6, val)
+
+#define read_c0_compare3()	__read_32bit_c0_register($11, 7) /* pnx8550 */
+#define write_c0_compare3(val)	__write_32bit_c0_register($11, 7, val)
+
+#define read_c0_status()	__read_32bit_c0_register($12, 0)
+#ifdef CONFIG_MIPS_MT_SMTC
+#define write_c0_status(val)						\
+do {									\
+	__write_32bit_c0_register($12, 0, val);				\
+	__ehb();							\
+} while (0)
+#else
+/*
+ * Legacy non-SMTC code, which may be hazardous
+ * but which might not support EHB
+ */
+#define write_c0_status(val)	__write_32bit_c0_register($12, 0, val)
+#endif /* CONFIG_MIPS_MT_SMTC */
+
+#define read_c0_cause()		__read_32bit_c0_register($13, 0)
+#define write_c0_cause(val)	__write_32bit_c0_register($13, 0, val)
+
+#define read_c0_epc()		__read_ulong_c0_register($14, 0)
+#define write_c0_epc(val)	__write_ulong_c0_register($14, 0, val)
+
+#define read_c0_prid()		__read_32bit_c0_register($15, 0)
+
+#define read_c0_config()	__read_32bit_c0_register($16, 0)
+#define read_c0_config1()	__read_32bit_c0_register($16, 1)
+#define read_c0_config2()	__read_32bit_c0_register($16, 2)
+#define read_c0_config3()	__read_32bit_c0_register($16, 3)
+#define read_c0_config4()	__read_32bit_c0_register($16, 4)
+#define read_c0_config5()	__read_32bit_c0_register($16, 5)
+#define read_c0_config6()	__read_32bit_c0_register($16, 6)
+#define read_c0_config7()	__read_32bit_c0_register($16, 7)
+#define write_c0_config(val)	__write_32bit_c0_register($16, 0, val)
+#define write_c0_config1(val)	__write_32bit_c0_register($16, 1, val)
+#define write_c0_config2(val)	__write_32bit_c0_register($16, 2, val)
+#define write_c0_config3(val)	__write_32bit_c0_register($16, 3, val)
+#define write_c0_config4(val)	__write_32bit_c0_register($16, 4, val)
+#define write_c0_config5(val)	__write_32bit_c0_register($16, 5, val)
+#define write_c0_config6(val)	__write_32bit_c0_register($16, 6, val)
+#define write_c0_config7(val)	__write_32bit_c0_register($16, 7, val)
+
+/*
+ * The WatchLo register.  There may be upto 8 of them.
+ */
+#define read_c0_watchlo0()	__read_ulong_c0_register($18, 0)
+#define read_c0_watchlo1()	__read_ulong_c0_register($18, 1)
+#define read_c0_watchlo2()	__read_ulong_c0_register($18, 2)
+#define read_c0_watchlo3()	__read_ulong_c0_register($18, 3)
+#define read_c0_watchlo4()	__read_ulong_c0_register($18, 4)
+#define read_c0_watchlo5()	__read_ulong_c0_register($18, 5)
+#define read_c0_watchlo6()	__read_ulong_c0_register($18, 6)
+#define read_c0_watchlo7()	__read_ulong_c0_register($18, 7)
+#define write_c0_watchlo0(val)	__write_ulong_c0_register($18, 0, val)
+#define write_c0_watchlo1(val)	__write_ulong_c0_register($18, 1, val)
+#define write_c0_watchlo2(val)	__write_ulong_c0_register($18, 2, val)
+#define write_c0_watchlo3(val)	__write_ulong_c0_register($18, 3, val)
+#define write_c0_watchlo4(val)	__write_ulong_c0_register($18, 4, val)
+#define write_c0_watchlo5(val)	__write_ulong_c0_register($18, 5, val)
+#define write_c0_watchlo6(val)	__write_ulong_c0_register($18, 6, val)
+#define write_c0_watchlo7(val)	__write_ulong_c0_register($18, 7, val)
+
+/*
+ * The WatchHi register.  There may be upto 8 of them.
+ */
+#define read_c0_watchhi0()	__read_32bit_c0_register($19, 0)
+#define read_c0_watchhi1()	__read_32bit_c0_register($19, 1)
+#define read_c0_watchhi2()	__read_32bit_c0_register($19, 2)
+#define read_c0_watchhi3()	__read_32bit_c0_register($19, 3)
+#define read_c0_watchhi4()	__read_32bit_c0_register($19, 4)
+#define read_c0_watchhi5()	__read_32bit_c0_register($19, 5)
+#define read_c0_watchhi6()	__read_32bit_c0_register($19, 6)
+#define read_c0_watchhi7()	__read_32bit_c0_register($19, 7)
+
+#define write_c0_watchhi0(val)	__write_32bit_c0_register($19, 0, val)
+#define write_c0_watchhi1(val)	__write_32bit_c0_register($19, 1, val)
+#define write_c0_watchhi2(val)	__write_32bit_c0_register($19, 2, val)
+#define write_c0_watchhi3(val)	__write_32bit_c0_register($19, 3, val)
+#define write_c0_watchhi4(val)	__write_32bit_c0_register($19, 4, val)
+#define write_c0_watchhi5(val)	__write_32bit_c0_register($19, 5, val)
+#define write_c0_watchhi6(val)	__write_32bit_c0_register($19, 6, val)
+#define write_c0_watchhi7(val)	__write_32bit_c0_register($19, 7, val)
+
+#define read_c0_xcontext()	__read_ulong_c0_register($20, 0)
+#define write_c0_xcontext(val)	__write_ulong_c0_register($20, 0, val)
+
+#define read_c0_intcontrol()	__read_32bit_c0_ctrl_register($20)
+#define write_c0_intcontrol(val) __write_32bit_c0_ctrl_register($20, val)
+
+#define read_c0_framemask()	__read_32bit_c0_register($21, 0)
+#define write_c0_framemask(val)	__write_32bit_c0_register($21, 0, val)
+
+/* RM9000 PerfControl performance counter control register */
+#define read_c0_perfcontrol()	__read_32bit_c0_register($22, 0)
+#define write_c0_perfcontrol(val) __write_32bit_c0_register($22, 0, val)
+
+#define read_c0_diag()		__read_32bit_c0_register($22, 0)
+#define write_c0_diag(val)	__write_32bit_c0_register($22, 0, val)
+
+#define read_c0_diag1()		__read_32bit_c0_register($22, 1)
+#define write_c0_diag1(val)	__write_32bit_c0_register($22, 1, val)
+
+#define read_c0_diag2()		__read_32bit_c0_register($22, 2)
+#define write_c0_diag2(val)	__write_32bit_c0_register($22, 2, val)
+
+#define read_c0_diag3()		__read_32bit_c0_register($22, 3)
+#define write_c0_diag3(val)	__write_32bit_c0_register($22, 3, val)
+
+#define read_c0_diag4()		__read_32bit_c0_register($22, 4)
+#define write_c0_diag4(val)	__write_32bit_c0_register($22, 4, val)
+
+#define read_c0_diag5()		__read_32bit_c0_register($22, 5)
+#define write_c0_diag5(val)	__write_32bit_c0_register($22, 5, val)
+
+#define read_c0_debug()		__read_32bit_c0_register($23, 0)
+#define write_c0_debug(val)	__write_32bit_c0_register($23, 0, val)
+
+#define read_c0_depc()		__read_ulong_c0_register($24, 0)
+#define write_c0_depc(val)	__write_ulong_c0_register($24, 0, val)
+
+/*
+ * MIPS32 / MIPS64 performance counters
+ */
+#define read_c0_perfctrl0()	__read_32bit_c0_register($25, 0)
+#define write_c0_perfctrl0(val)	__write_32bit_c0_register($25, 0, val)
+#define read_c0_perfcntr0()	__read_32bit_c0_register($25, 1)
+#define write_c0_perfcntr0(val)	__write_32bit_c0_register($25, 1, val)
+#define read_c0_perfctrl1()	__read_32bit_c0_register($25, 2)
+#define write_c0_perfctrl1(val)	__write_32bit_c0_register($25, 2, val)
+#define read_c0_perfcntr1()	__read_32bit_c0_register($25, 3)
+#define write_c0_perfcntr1(val)	__write_32bit_c0_register($25, 3, val)
+#define read_c0_perfctrl2()	__read_32bit_c0_register($25, 4)
+#define write_c0_perfctrl2(val)	__write_32bit_c0_register($25, 4, val)
+#define read_c0_perfcntr2()	__read_32bit_c0_register($25, 5)
+#define write_c0_perfcntr2(val)	__write_32bit_c0_register($25, 5, val)
+#define read_c0_perfctrl3()	__read_32bit_c0_register($25, 6)
+#define write_c0_perfctrl3(val)	__write_32bit_c0_register($25, 6, val)
+#define read_c0_perfcntr3()	__read_32bit_c0_register($25, 7)
+#define write_c0_perfcntr3(val)	__write_32bit_c0_register($25, 7, val)
+
+/* RM9000 PerfCount performance counter register */
+#define read_c0_perfcount()	__read_64bit_c0_register($25, 0)
+#define write_c0_perfcount(val)	__write_64bit_c0_register($25, 0, val)
+
+#define read_c0_ecc()		__read_32bit_c0_register($26, 0)
+#define write_c0_ecc(val)	__write_32bit_c0_register($26, 0, val)
+
+#define read_c0_derraddr0()	__read_ulong_c0_register($26, 1)
+#define write_c0_derraddr0(val)	__write_ulong_c0_register($26, 1, val)
+
+#define read_c0_cacheerr()	__read_32bit_c0_register($27, 0)
+
+#define read_c0_derraddr1()	__read_ulong_c0_register($27, 1)
+#define write_c0_derraddr1(val)	__write_ulong_c0_register($27, 1, val)
+
+#define read_c0_taglo()		__read_32bit_c0_register($28, 0)
+#define write_c0_taglo(val)	__write_32bit_c0_register($28, 0, val)
+
+#define read_c0_dtaglo()	__read_32bit_c0_register($28, 2)
+#define write_c0_dtaglo(val)	__write_32bit_c0_register($28, 2, val)
+
+#define read_c0_taghi()		__read_32bit_c0_register($29, 0)
+#define write_c0_taghi(val)	__write_32bit_c0_register($29, 0, val)
+
+#define read_c0_errorepc()	__read_ulong_c0_register($30, 0)
+#define write_c0_errorepc(val)	__write_ulong_c0_register($30, 0, val)
+
+/* MIPSR2 */
+#define read_c0_hwrena()	__read_32bit_c0_register($7,0)
+#define write_c0_hwrena(val)	__write_32bit_c0_register($7, 0, val)
+
+#define read_c0_intctl()	__read_32bit_c0_register($12, 1)
+#define write_c0_intctl(val)	__write_32bit_c0_register($12, 1, val)
+
+#define read_c0_srsctl()	__read_32bit_c0_register($12, 2)
+#define write_c0_srsctl(val)	__write_32bit_c0_register($12, 2, val)
+
+#define read_c0_srsmap()	__read_32bit_c0_register($12, 3)
+#define write_c0_srsmap(val)	__write_32bit_c0_register($12, 3, val)
+
+#define read_c0_ebase()		__read_32bit_c0_register($15,1)
+#define write_c0_ebase(val)	__write_32bit_c0_register($15, 1, val)
+
+/*
+ * Macros to access the floating point coprocessor control registers
+ */
+#define read_32bit_cp1_register(source)                         \
+({ int __res;                                                   \
+	__asm__ __volatile__(                                   \
+	".set\tpush\n\t"					\
+	".set\treorder\n\t"					\
+        "cfc1\t%0,"STR(source)"\n\t"                            \
+	".set\tpop"						\
+        : "=r" (__res));                                        \
+        __res;})
+
+#define rddsp(mask)							\
+({									\
+	unsigned int __res;						\
+									\
+	__asm__ __volatile__(						\
+	"	.set	push				\n"		\
+	"	.set	noat				\n"		\
+	"	# rddsp $1, %x1				\n"		\
+	"	.word	0x7c000cb8 | (%x1 << 16)	\n"		\
+	"	move	%0, $1				\n"		\
+	"	.set	pop				\n"		\
+	: "=r" (__res)							\
+	: "i" (mask));							\
+	__res;								\
+})
+
+#define wrdsp(val, mask)						\
+do {									\
+	__asm__ __volatile__(						\
+	"	.set	push					\n"	\
+	"	.set	noat					\n"	\
+	"	move	$1, %0					\n"	\
+	"	# wrdsp $1, %x1					\n"	\
+	"	.word	0x7c2004f8 | (%x1 << 11)		\n"	\
+	"	.set	pop					\n"	\
+        :								\
+	: "r" (val), "i" (mask));					\
+} while (0)
+
+#if 0	/* Need DSP ASE capable assembler ... */
+#define mflo0() ({ long mflo0; __asm__("mflo %0, $ac0" : "=r" (mflo0)); mflo0;})
+#define mflo1() ({ long mflo1; __asm__("mflo %0, $ac1" : "=r" (mflo1)); mflo1;})
+#define mflo2() ({ long mflo2; __asm__("mflo %0, $ac2" : "=r" (mflo2)); mflo2;})
+#define mflo3() ({ long mflo3; __asm__("mflo %0, $ac3" : "=r" (mflo3)); mflo3;})
+
+#define mfhi0() ({ long mfhi0; __asm__("mfhi %0, $ac0" : "=r" (mfhi0)); mfhi0;})
+#define mfhi1() ({ long mfhi1; __asm__("mfhi %0, $ac1" : "=r" (mfhi1)); mfhi1;})
+#define mfhi2() ({ long mfhi2; __asm__("mfhi %0, $ac2" : "=r" (mfhi2)); mfhi2;})
+#define mfhi3() ({ long mfhi3; __asm__("mfhi %0, $ac3" : "=r" (mfhi3)); mfhi3;})
+
+#define mtlo0(x) __asm__("mtlo %0, $ac0" ::"r" (x))
+#define mtlo1(x) __asm__("mtlo %0, $ac1" ::"r" (x))
+#define mtlo2(x) __asm__("mtlo %0, $ac2" ::"r" (x))
+#define mtlo3(x) __asm__("mtlo %0, $ac3" ::"r" (x))
+
+#define mthi0(x) __asm__("mthi %0, $ac0" ::"r" (x))
+#define mthi1(x) __asm__("mthi %0, $ac1" ::"r" (x))
+#define mthi2(x) __asm__("mthi %0, $ac2" ::"r" (x))
+#define mthi3(x) __asm__("mthi %0, $ac3" ::"r" (x))
+
+#else
+
+#define mfhi0()								\
+({									\
+	unsigned long __treg;						\
+									\
+	__asm__ __volatile__(						\
+	"	.set	push			\n"			\
+	"	.set	noat			\n"			\
+	"	# mfhi	%0, $ac0		\n"			\
+	"	.word	0x00000810		\n"			\
+	"	move	%0, $1			\n"			\
+	"	.set	pop			\n"			\
+	: "=r" (__treg));						\
+	__treg;								\
+})
+
+#define mfhi1()								\
+({									\
+	unsigned long __treg;						\
+									\
+	__asm__ __volatile__(						\
+	"	.set	push			\n"			\
+	"	.set	noat			\n"			\
+	"	# mfhi	%0, $ac1		\n"			\
+	"	.word	0x00200810		\n"			\
+	"	move	%0, $1			\n"			\
+	"	.set	pop			\n"			\
+	: "=r" (__treg));						\
+	__treg;								\
+})
+
+#define mfhi2()								\
+({									\
+	unsigned long __treg;						\
+									\
+	__asm__ __volatile__(						\
+	"	.set	push			\n"			\
+	"	.set	noat			\n"			\
+	"	# mfhi	%0, $ac2		\n"			\
+	"	.word	0x00400810		\n"			\
+	"	move	%0, $1			\n"			\
+	"	.set	pop			\n"			\
+	: "=r" (__treg));						\
+	__treg;								\
+})
+
+#define mfhi3()								\
+({									\
+	unsigned long __treg;						\
+									\
+	__asm__ __volatile__(						\
+	"	.set	push			\n"			\
+	"	.set	noat			\n"			\
+	"	# mfhi	%0, $ac3		\n"			\
+	"	.word	0x00600810		\n"			\
+	"	move	%0, $1			\n"			\
+	"	.set	pop			\n"			\
+	: "=r" (__treg));						\
+	__treg;								\
+})
+
+#define mflo0()								\
+({									\
+	unsigned long __treg;						\
+									\
+	__asm__ __volatile__(						\
+	"	.set	push			\n"			\
+	"	.set	noat			\n"			\
+	"	# mflo	%0, $ac0		\n"			\
+	"	.word	0x00000812		\n"			\
+	"	move	%0, $1			\n"			\
+	"	.set	pop			\n"			\
+	: "=r" (__treg));						\
+	__treg;								\
+})
+
+#define mflo1()								\
+({									\
+	unsigned long __treg;						\
+									\
+	__asm__ __volatile__(						\
+	"	.set	push			\n"			\
+	"	.set	noat			\n"			\
+	"	# mflo	%0, $ac1		\n"			\
+	"	.word	0x00200812		\n"			\
+	"	move	%0, $1			\n"			\
+	"	.set	pop			\n"			\
+	: "=r" (__treg));						\
+	__treg;								\
+})
+
+#define mflo2()								\
+({									\
+	unsigned long __treg;						\
+									\
+	__asm__ __volatile__(						\
+	"	.set	push			\n"			\
+	"	.set	noat			\n"			\
+	"	# mflo	%0, $ac2		\n"			\
+	"	.word	0x00400812		\n"			\
+	"	move	%0, $1			\n"			\
+	"	.set	pop			\n"			\
+	: "=r" (__treg));						\
+	__treg;								\
+})
+
+#define mflo3()								\
+({									\
+	unsigned long __treg;						\
+									\
+	__asm__ __volatile__(						\
+	"	.set	push			\n"			\
+	"	.set	noat			\n"			\
+	"	# mflo	%0, $ac3		\n"			\
+	"	.word	0x00600812		\n"			\
+	"	move	%0, $1			\n"			\
+	"	.set	pop			\n"			\
+	: "=r" (__treg));						\
+	__treg;								\
+})
+
+#define mthi0(x)							\
+do {									\
+	__asm__ __volatile__(						\
+	"	.set	push					\n"	\
+	"	.set	noat					\n"	\
+	"	move	$1, %0					\n"	\
+	"	# mthi	$1, $ac0				\n"	\
+	"	.word	0x00200011				\n"	\
+	"	.set	pop					\n"	\
+	:								\
+	: "r" (x));							\
+} while (0)
+
+#define mthi1(x)							\
+do {									\
+	__asm__ __volatile__(						\
+	"	.set	push					\n"	\
+	"	.set	noat					\n"	\
+	"	move	$1, %0					\n"	\
+	"	# mthi	$1, $ac1				\n"	\
+	"	.word	0x00200811				\n"	\
+	"	.set	pop					\n"	\
+	:								\
+	: "r" (x));							\
+} while (0)
+
+#define mthi2(x)							\
+do {									\
+	__asm__ __volatile__(						\
+	"	.set	push					\n"	\
+	"	.set	noat					\n"	\
+	"	move	$1, %0					\n"	\
+	"	# mthi	$1, $ac2				\n"	\
+	"	.word	0x00201011				\n"	\
+	"	.set	pop					\n"	\
+	:								\
+	: "r" (x));							\
+} while (0)
+
+#define mthi3(x)							\
+do {									\
+	__asm__ __volatile__(						\
+	"	.set	push					\n"	\
+	"	.set	noat					\n"	\
+	"	move	$1, %0					\n"	\
+	"	# mthi	$1, $ac3				\n"	\
+	"	.word	0x00201811				\n"	\
+	"	.set	pop					\n"	\
+	:								\
+	: "r" (x));							\
+} while (0)
+
+#define mtlo0(x)							\
+do {									\
+	__asm__ __volatile__(						\
+	"	.set	push					\n"	\
+	"	.set	noat					\n"	\
+	"	move	$1, %0					\n"	\
+	"	# mtlo	$1, $ac0				\n"	\
+	"	.word	0x00200013				\n"	\
+	"	.set	pop					\n"	\
+	:								\
+	: "r" (x));							\
+} while (0)
+
+#define mtlo1(x)							\
+do {									\
+	__asm__ __volatile__(						\
+	"	.set	push					\n"	\
+	"	.set	noat					\n"	\
+	"	move	$1, %0					\n"	\
+	"	# mtlo	$1, $ac1				\n"	\
+	"	.word	0x00200813				\n"	\
+	"	.set	pop					\n"	\
+	:								\
+	: "r" (x));							\
+} while (0)
+
+#define mtlo2(x)							\
+do {									\
+	__asm__ __volatile__(						\
+	"	.set	push					\n"	\
+	"	.set	noat					\n"	\
+	"	move	$1, %0					\n"	\
+	"	# mtlo	$1, $ac2				\n"	\
+	"	.word	0x00201013				\n"	\
+	"	.set	pop					\n"	\
+	:								\
+	: "r" (x));							\
+} while (0)
+
+#define mtlo3(x)							\
+do {									\
+	__asm__ __volatile__(						\
+	"	.set	push					\n"	\
+	"	.set	noat					\n"	\
+	"	move	$1, %0					\n"	\
+	"	# mtlo	$1, $ac3				\n"	\
+	"	.word	0x00201813				\n"	\
+	"	.set	pop					\n"	\
+	:								\
+	: "r" (x));							\
+} while (0)
+
+#endif
+
+/*
+ * TLB operations.
+ *
+ * It is responsibility of the caller to take care of any TLB hazards.
+ */
+static inline void tlb_probe(void)
+{
+	__asm__ __volatile__(
+		".set noreorder\n\t"
+		"tlbp\n\t"
+		".set reorder");
+}
+
+static inline void tlb_read(void)
+{
+	__asm__ __volatile__(
+		".set noreorder\n\t"
+		"tlbr\n\t"
+		".set reorder");
+}
+
+static inline void tlb_write_indexed(void)
+{
+	__asm__ __volatile__(
+		".set noreorder\n\t"
+		"tlbwi\n\t"
+		".set reorder");
+}
+
+static inline void tlb_write_random(void)
+{
+	__asm__ __volatile__(
+		".set noreorder\n\t"
+		"tlbwr\n\t"
+		".set reorder");
+}
+
+/*
+ * Manipulate bits in a c0 register.
+ */
+#ifndef CONFIG_MIPS_MT_SMTC
+/*
+ * SMTC Linux requires shutting-down microthread scheduling
+ * during CP0 register read-modify-write sequences.
+ */
+#define __BUILD_SET_C0(name)					\
+static inline unsigned int					\
+set_c0_##name(unsigned int set)					\
+{								\
+	unsigned int res;					\
+								\
+	res = read_c0_##name();					\
+	res |= set;						\
+	write_c0_##name(res);					\
+								\
+	return res;						\
+}								\
+								\
+static inline unsigned int					\
+clear_c0_##name(unsigned int clear)				\
+{								\
+	unsigned int res;					\
+								\
+	res = read_c0_##name();					\
+	res &= ~clear;						\
+	write_c0_##name(res);					\
+								\
+	return res;						\
+}								\
+								\
+static inline unsigned int					\
+change_c0_##name(unsigned int change, unsigned int new)		\
+{								\
+	unsigned int res;					\
+								\
+	res = read_c0_##name();					\
+	res &= ~change;						\
+	res |= (new & change);					\
+	write_c0_##name(res);					\
+								\
+	return res;						\
+}
+
+#else /* SMTC versions that manage MT scheduling */
+
+#include <linux/irqflags.h>
+
+/*
+ * This is a duplicate of dmt() in mipsmtregs.h to avoid problems with
+ * header file recursion.
+ */
+static inline unsigned int __dmt(void)
+{
+	int res;
+
+	__asm__ __volatile__(
+	"	.set	push						\n"
+	"	.set	mips32r2					\n"
+	"	.set	noat						\n"
+	"	.word	0x41610BC1			# dmt $1	\n"
+	"	ehb							\n"
+	"	move	%0, $1						\n"
+	"	.set	pop						\n"
+	: "=r" (res));
+
+	instruction_hazard();
+
+	return res;
+}
+
+#define __VPECONTROL_TE_SHIFT	15
+#define __VPECONTROL_TE		(1UL << __VPECONTROL_TE_SHIFT)
+
+#define __EMT_ENABLE		__VPECONTROL_TE
+
+static inline void __emt(unsigned int previous)
+{
+	if ((previous & __EMT_ENABLE))
+		__asm__ __volatile__(
+		"	.set	mips32r2				\n"
+		"	.word	0x41600be1		# emt		\n"
+		"	ehb						\n"
+		"	.set	mips0					\n");
+}
+
+static inline void __ehb(void)
+{
+	__asm__ __volatile__(
+	"	.set	mips32r2					\n"
+	"	ehb							\n"		"	.set	mips0						\n");
+}
+
+/*
+ * Note that local_irq_save/restore affect TC-specific IXMT state,
+ * not Status.IE as in non-SMTC kernel.
+ */
+
+#define __BUILD_SET_C0(name)					\
+static inline unsigned int					\
+set_c0_##name(unsigned int set)					\
+{								\
+	unsigned int res;					\
+	unsigned int omt;					\
+	unsigned int flags;					\
+								\
+	local_irq_save(flags);					\
+	omt = __dmt();						\
+	res = read_c0_##name();					\
+	res |= set;						\
+	write_c0_##name(res);					\
+	__emt(omt);						\
+	local_irq_restore(flags);				\
+								\
+	return res;						\
+}								\
+								\
+static inline unsigned int					\
+clear_c0_##name(unsigned int clear)				\
+{								\
+	unsigned int res;					\
+	unsigned int omt;					\
+	unsigned int flags;					\
+								\
+	local_irq_save(flags);					\
+	omt = __dmt();						\
+	res = read_c0_##name();					\
+	res &= ~clear;						\
+	write_c0_##name(res);					\
+	__emt(omt);						\
+	local_irq_restore(flags);				\
+								\
+	return res;						\
+}								\
+								\
+static inline unsigned int					\
+change_c0_##name(unsigned int change, unsigned int new)		\
+{								\
+	unsigned int res;					\
+	unsigned int omt;					\
+	unsigned int flags;					\
+								\
+	local_irq_save(flags);					\
+								\
+	omt = __dmt();						\
+	res = read_c0_##name();					\
+	res &= ~change;						\
+	res |= (new & change);					\
+	write_c0_##name(res);					\
+	__emt(omt);						\
+	local_irq_restore(flags);				\
+								\
+	return res;						\
+}
+#endif
+
+__BUILD_SET_C0(status)
+__BUILD_SET_C0(cause)
+__BUILD_SET_C0(config)
+__BUILD_SET_C0(intcontrol)
+__BUILD_SET_C0(intctl)
+__BUILD_SET_C0(srsmap)
+
+#endif /* !__ASSEMBLY__ */
+
+#endif /* _ASM_MIPSREGS_H */
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/patch_files/Makefile b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/patch_files/Makefile
new file mode 100644
index 0000000..2ea53bb
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/patch_files/Makefile
@@ -0,0 +1,16 @@
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# 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.
+#
+
+# platform driver
+ccflags-y += -I../inc
+snd-soc-procslic-patch-objs := si3218x_patch_A_2017MAY25.o
+
+obj-$(CONFIG_SND_SOC_SI3218X) += snd-soc-proslic-patch.o
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/patch_files/si3218x_patch_A_2017MAY25.c b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/patch_files/si3218x_patch_A_2017MAY25.c
new file mode 100644
index 0000000..ccccb75
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/patch_files/si3218x_patch_A_2017MAY25.c
@@ -0,0 +1,242 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Generated from si3218x_patch_A_2017MAY25.dsp_prom
+ * on 05-25-2017 at 15:1:37
+ * Patch ID = 0x05252017L
+ *
+ * This file contains proprietary information.
+ * No dissemination allowed without prior written permission from
+ * Silicon Laboratories, Inc.
+ */
+#include "../config_inc/si_voice_datatypes.h"
+#include "../inc/si3218x.h"
+
+static const uInt32 patchData [] = {
+141029L,
+540867L,
+141029L,
+543427L,
+141029L,
+553667L,
+141029L,
+562883L,
+141029L,
+567491L,
+141029L,
+569539L,
+141029L,
+580803L,
+141029L,
+586435L,
+141029L,
+593091L,
+141029L,
+598211L,
+141029L,
+603843L,
+141029L,
+604355L,
+141029L,
+604867L,
+141029L,
+605379L,
+141029L,
+605891L,
+141029L,
+606403L,
+736L,
+492224L,
+452200L,
+141029L,
+491712L,
+558181L,
+410018L,
+539765L,
+142565L,
+551619L,
+355746L,
+539765L,
+142560L,
+548547L,
+767493L,
+356258L,
+407477L,
+142561L,
+551619L,
+767493L,
+539749L,
+743525L,
+119426L,
+141029L,
+925377L,
+387589L,
+558181L,
+388514L,
+387701L,
+142565L,
+561347L,
+524290L,
+144096L,
+559811L,
+524292L,
+141029L,
+560835L,
+524290L,
+437360L,
+671749L,
+437349L,
+141029L,
+21186L,
+560741L,
+524290L,
+143072L,
+565955L,
+141029L,
+122050L,
+694789L,
+141029L,
+789186L,
+408165L,
+408645L,
+141029L,
+950976L,
+524291L,
+144101L,
+571587L,
+199685L,
+666853L,
+574659L,
+431717L,
+197189L,
+136805L,
+198725L,
+408677L,
+262242L,
+524291L,
+144101L,
+577731L,
+408581L,
+666853L,
+873664L,
+136805L,
+407621L,
+141029L,
+873664L,
+9733L,
+136805L,
+116130L,
+524304L,
+660069L,
+440424L,
+9827L,
+660066L,
+524315L,
+141029L,
+674496L,
+694789L,
+828517L,
+119426L,
+267414L,
+829441L,
+828933L,
+694789L,
+118405L,
+788805L,
+725829L,
+119424L,
+141029L,
+230594L,
+492645L,
+252002L,
+524295L,
+517220L,
+144101L,
+596675L,
+517733L,
+827461L,
+141029L,
+745664L,
+466437L,
+558181L,
+410018L,
+519797L,
+142565L,
+601795L,
+385637L,
+466597L,
+524289L,
+141029L,
+27330L,
+524293L,
+524293L,
+524293L,
+524293L,
+524293L,
+524293L,
+0L
+};
+
+static const uInt16 patchEntries [] = {
+951,
+3854,
+4136,
+4333,
+1856,
+1695,
+1316,
+4545,
+1455,
+4148,
+0,
+0,
+0,
+0,
+0,
+0
+};
+
+static const uInt16 patchSupportAddr [] = {
+800,
+694,
+695,
+795,
+914,
+758,
+757,
+798,
+797,
+796,
+226,
+1011,
+1010,
+0
+};
+
+static const uInt32 patchSupportData [] = {
+0x200000L,
+0x80000L,
+0x200000L,
+0x180000L,
+0x07FCFDDAL,
+0x400000L,
+0x0L,
+0x123400L,
+0x123400L,
+0x123400L,
+0x35D540L,
+0x3F00000L,
+0x100000L,
+0x0L
+};
+
+#ifdef SIVOICE_MULTI_BOM_SUPPORT
+const proslicPatch si3218xPatchRevALCQC = {
+#else
+const proslicPatch RevAPatch = {
+#endif
+    patchData,
+    patchEntries,
+    0x05252017L,
+    patchSupportAddr,
+    patchSupportData
+};
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/proslic_spi_api.c b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/proslic_spi_api.c
new file mode 100644
index 0000000..77e67d0
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/proslic_spi_api.c
@@ -0,0 +1,206 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * spi.h
+ * SPI driver implementation file
+ *
+ * Author(s): 
+ * laj
+ *
+ * Distributed by: 
+ * Silicon Laboratories, Inc
+ *
+ * File Description:
+ * This is the implementation file for the SPI driver used 
+ * in the ProSLIC demonstration code. It calls the library
+ * that initializes and talks to the proslic motherboard.
+ *
+ * Dependancies:
+ *
+ */
+//#include "../iowrapper.h" // This is the motherboard interface library
+#include <linux/kernel.h>
+#include <linux/delay.h>
+#include "config_inc/si_voice_datatypes.h"
+#include "inc/si_voice_ctrl.h"
+#include "spi.h"
+#include "proslic_sys.h"
+
+/*
+** Function: SPI_Init
+**
+** Description: 
+** Initializes the SPI interface
+**
+** Input Parameters: 
+** none
+**
+** Return:
+** none
+*/
+int SPI_Init (ctrl_S *hSpi){
+	int ret;
+
+	ret = proslic_spi_setup();
+
+	return 0;
+}
+
+/*
+** Function: spiGci_ResetWrapper
+**
+** Description: 
+** Sets the reset pin of the ProSLIC
+*/
+int ctrl_ResetWrapper (void *hSpiGci, int status){
+	
+	printk("ctrl_ResetWrapper");	
+	proslic_reset(NULL, status);
+
+	return 0;
+}
+
+/*
+** SPI/GCI register read 
+**
+** Description: 
+** Reads a single ProSLIC register
+**
+** Input Parameters: 
+** channel: ProSLIC channel to read from
+** regAddr: Address of register to read
+** return data: data to read from register
+**
+** Return:
+** none
+*/
+uInt8 ctrl_ReadRegisterWrapper (void *hSpiGci, uInt8 channel, uInt8 regAddr){
+	
+
+	return proslic_read_register(hSpiGci,channel,regAddr);
+}
+
+
+/*
+** Function: spiGci_WriteRegisterWrapper 
+**
+** Description: 
+** Writes a single ProSLIC register
+**
+** Input Parameters: 
+** channel: ProSLIC channel to write to
+** address: Address of register to write
+** data: data to write to register
+**
+** Return:
+** none
+*/
+int ctrl_WriteRegisterWrapper (void *hSpiGci, unsigned char channel, unsigned char regAddr, unsigned char data){
+
+	proslic_write_register(hSpiGci,channel,regAddr, data);
+	return 0;
+}
+
+
+/*
+** Function: SPI_ReadRAMWrapper
+**
+** Description: 
+** Reads a single ProSLIC RAM location
+**
+** Input Parameters: 
+** channel: ProSLIC channel to read from
+** address: Address of RAM location to read
+** pData: data to read from RAM location
+**
+** Return:
+** none
+*/
+ramData ctrl_ReadRAMWrapper (void *hSpiGci, unsigned char channel, unsigned short ramAddr){
+	ramData data;
+
+	data = proslic_read_ram(hSpiGci,channel,ramAddr);
+
+	return data;
+}
+
+
+/*
+** Function: SPI_WriteRAMWrapper
+**
+** Description: 
+** Writes a single ProSLIC RAM location
+**
+** Input Parameters: 
+** channel: ProSLIC channel to write to
+** address: Address of RAM location to write
+** data: data to write to RAM location
+**
+** Return:
+** none
+*/
+int ctrl_WriteRAMWrapper (void *hSpiGci, unsigned char channel, unsigned short ramAddr, ramData data){
+
+	proslic_write_ram(hSpiGci,channel,ramAddr,data);
+
+	return 0;
+}
+
+
+
+/*
+** $Log: proslic_spi_api.c,v $
+** Revision 1.11  2008/07/24 21:06:16  lajordan
+** no message
+**
+** Revision 1.10  2008/03/19 18:20:09  lajordan
+** no message
+**
+** Revision 1.9  2007/06/04 16:35:51  lajordan
+** added profiling
+**
+** Revision 1.8  2007/02/27 19:25:48  lajordan
+** updated api
+**
+** Revision 1.7  2007/02/05 23:43:27  lajordan
+** fixed register access func
+**
+** Revision 1.6  2006/11/22 21:38:19  lajordan
+** broadcast added
+**
+** Revision 1.5  2006/07/21 20:31:26  lajordan
+** fixed cant connect message
+**
+** Revision 1.4  2006/07/19 18:15:56  lajordan
+** fixed spi init
+**
+** Revision 1.3  2006/07/18 21:50:16  lajordan
+** removed extraneous endif
+**
+** Revision 1.2  2006/07/18 21:48:51  lajordan
+** added 16 bit accesses example code
+**
+** Revision 1.1.1.1  2006/07/13 20:26:08  lajordan
+** no message
+**
+** Revision 1.1.1.1  2006/07/06 22:06:23  lajordan
+** no message
+**
+** Revision 1.3  2006/06/29 19:11:18  laj
+** lpt driver completed
+**
+** Revision 1.2  2006/06/21 23:46:58  laj
+** register reads/writes added
+**
+** Revision 1.1  2006/06/21 23:18:07  laj
+** no message
+**
+** Revision 1.1  2006/06/21 22:42:26  laj
+** new api style
+**
+** Revision 1.3  2005/11/14 17:42:34  laj
+** added SPI_init
+**
+** Revision 1.2  2005/11/07 23:20:54  laj
+** took out extra spaces
+**
+*/
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/proslic_sys.h b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/proslic_sys.h
new file mode 100644
index 0000000..d629915
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/proslic_sys.h
@@ -0,0 +1,120 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifndef __PROSLIC_SYS_HDR__
+#define __PROSLIC_SYS_HDR__ 1
+#include <linux/types.h>
+#include <linux/time64.h> /* for struct timespec */
+
+#include <linux/spi/spi.h>
+
+#include "proslic_sys_cfg.h"
+
+
+
+/* Do a quick sanity check on  channel setting */
+#define SILABS_MAX_CHAN 32 
+#if (SILABS_MAX_CHANNELS > SILABS_MAX_CHAN)
+#error "ProSLIC only supports up to 32 channels"
+#endif
+
+#define PROSLIC_BCAST       0xFF
+#define PROSLIC_SPI_OK      0
+#define PROSLIC_SPI_NOK     8 /* This is what the ProSLIC API calls SPI_FAIL */ 
+#define PROSLIC_TIMER_ERROR 15
+
+/* Debug macros */
+#define PROSLIC_API_HDR "PROSLIC_API "
+
+#define proslic_trace(fmt, arg...) if(proslic_debug_setting & 0x1) printk( KERN_NOTICE PROSLIC_API_HDR "TRC: " fmt "\n", ##arg)
+#define proslic_debug(fmt, arg...) if(proslic_debug_setting & 0x2) printk( KERN_DEBUG PROSLIC_API_HDR "DBG: " fmt "\n", ##arg)
+#define  proslic_error(fmt, arg...) if(proslic_debug_setting & 0x4) printk( KERN_ERR PROSLIC_API_HDR "ERR: " fmt "\n", ##arg)
+
+/* Data types compatible with the ProSLIC API system services layer */
+typedef u_int8_t            BOOLEAN;
+typedef int8_t              int8;
+typedef u_int8_t            uInt8;
+typedef uInt8               uChar;
+typedef int16_t             int16;
+typedef u_int16_t           uInt16;
+typedef int32_t             int32;
+typedef u_int32_t           uInt32;
+typedef u_int32_t           ramData;
+
+
+#ifndef CTRL_H
+/* Function prototypes compatible with the ProSLIC API system services layer */
+typedef int (*ctrl_Reset_fptr) (void *hCtrl, int in_reset);
+
+typedef int (*ctrl_WriteRegister_fptr) (void *hCtrl, uInt8 channel, uInt8 regAddr, uInt8 data);
+typedef int (*ctrl_WriteRAM_fptr) (void *hCtrl, uInt8 channel, uInt16 ramAddr, ramData data);
+
+typedef uInt8 (*ctrl_ReadRegister_fptr) (void *hCtrl, uInt8 channel, uInt8 regAddr);
+typedef ramData (*ctrl_ReadRAM_fptr) (void *hCtrl, uInt8 channel, uInt16 ramAddr);
+
+typedef int (*ctrl_Semaphore_fptr) (void *hCtrl, int in_critical_section);
+#endif
+
+typedef void *(*get_hctrl) (uInt8 channel); /* Get a pointer to the control interface */
+
+typedef int (*system_delay_fptr) (void *hTimer, int timeInMs);
+typedef int (*system_timeElapsed_fptr) (void *hTimer, void *startTime, int *timeInMs);
+typedef int (*system_getTime_fptr) (void *hTimer, void *time);
+typedef void *(get_Timer)(void); /* return a pointer to "the" hTimer */
+
+/* Function table entries to reduce namespace pollution */
+typedef struct
+{
+  ctrl_Reset_fptr             reset;
+
+  ctrl_WriteRegister_fptr     write_reg;
+  ctrl_WriteRAM_fptr          write_ram;
+
+  ctrl_ReadRegister_fptr      read_reg;
+  ctrl_ReadRAM_fptr           read_ram;
+
+  ctrl_Semaphore_fptr         sem;
+} proslic_spi_fptrs_t;
+
+typedef struct
+{
+  system_delay_fptr          slic_delay;
+  system_timeElapsed_fptr    elapsed_time;
+  system_getTime_fptr        get_time;
+} proslic_timer_fptrs_t;
+
+/* Timer container */
+typedef struct 
+{
+  struct timespec64 timerObj;
+} proslic_timeStamp;
+
+extern int proslic_channel_count;
+extern int proslic_debug_setting;
+int proslic_spi_setup(void);
+void proslic_spi_shutdown(void);
+
+typedef enum
+{
+  PROSLIC_IS_UNKNOWN,
+  PROSLIC_IS_PROSLIC,
+  PROSLIC_IS_DAA
+} proslic_dev_t;
+
+/* Exported functions/values */
+extern proslic_timer_fptrs_t proslic_timer_if;
+extern proslic_spi_fptrs_t proslic_spi_if; 
+int proslic_reset(void *hCtrl, int in_reset);
+int proslic_write_register(void *hCtrl, uInt8 channel, uInt8 regAddr, uInt8 data);
+int proslic_write_ram(void *hCtrl, uInt8 channel, uInt16 ramAddr, ramData data);
+uInt8 proslic_read_register(void *hCtrl, uInt8 channel, uInt8 regAddr);
+ramData proslic_read_ram(void *hCtrl, uInt8 channel, uInt16 ramAddr);
+
+int proslic_get_channel_count(void);
+proslic_dev_t proslic_get_device_type(uint8_t channel);
+void *proslic_get_hCtrl(uint8_t channel);
+int proslic_spi_probe(struct spi_device *spi, struct spi_driver *spi_drv);
+int proslic_spi_remove(struct spi_device *spi);
+
+
+#endif /* End of __PROSLIC_SYS_HDR__ */
+
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/proslic_sys_cfg.h b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/proslic_sys_cfg.h
new file mode 100644
index 0000000..021a9c6
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/proslic_sys_cfg.h
@@ -0,0 +1,24 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifndef __PROSLIC_SYS_CFG_HDR__
+#define __PROSLIC_SYS_CFG_HDR__ 1
+/* 
+ * Begin user defined build options 
+ *
+ * TODO: move this to a .kconfig option menu
+ */
+
+#define SILABS_BITS_PER_WORD    8        /* MUST be either 8, 16, or 32 */
+#define SILABS_SPI_RATE         4000000  /* In terms of Hz */
+#define SILABS_MAX_RAM_WAIT     1000     /* In terms of loop count */
+#define SILABS_RESET_GPIO       135
+#define SILABS_MAX_CHANNELS     4
+#define SILABS_RAM_BLOCK_ACCESS 1        /* Define this if you wish to use a single block to write to RAM, may not work on all systems */
+#define SILABS_DEFAULT_DBG      7
+#define SILABS_MIN_MSLEEP_TIME  30       /* threshold to call mdelay vs. msleep() */
+#define SILABS_MSLEEP_SLOP      10       /* If the msleep() function is off by a constant value, set this number positive if it's too long or negative number for too short - terms of mSec */
+#define PROSLIC_XFER_BUF        4        /* How many bytes to send in 1 transfer.  Either 1,2, or 4.  If setting SILABS_BITS_PER_WORD to 16 or 32, you MUST set this either 2 or 4 */
+/* End of user defined section */
+
+#endif /* __PROSLIC_SYS_CFG_HDR__ */
+
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/proslic_sys_main.c b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/proslic_sys_main.c
new file mode 100644
index 0000000..b9243c4
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/proslic_sys_main.c
@@ -0,0 +1,65 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/moduleparam.h>
+#include "proslic_sys.h"
+
+#define PROSLIC_SYS_SERVICES_VER   "0.0.1"
+#define DRIVER_DESCRIPTION         "ProSLIC API compatible system services"
+#define DRIVER_AUTHOR              "Silicon Laboratories"
+
+int proslic_debug_setting = SILABS_DEFAULT_DBG;
+int proslic_channel_count = SILABS_MAX_CHANNELS;
+
+module_param(proslic_debug_setting, int, S_IRUSR | S_IWUSR |S_IRGRP | S_IWGRP);
+MODULE_PARM_DESC(proslic_debug_setting, "debug mode bitmask, 1 = TRC, 2 = DBG, 4 = ERR");
+module_param(proslic_channel_count, int, S_IRUSR | S_IRGRP  );
+MODULE_PARM_DESC(proslic_channel_count, "Number of actual channels on the platform");
+
+/*****************************************************************************************************/
+
+int init_module(void)
+{
+  int rc;
+
+  printk( KERN_INFO "ProSLIC API system services module loaded, version: %s\n", PROSLIC_SYS_SERVICES_VER);
+  printk( KERN_INFO "Debug = 0x%0x\n", proslic_debug_setting);
+
+  if(proslic_channel_count > SILABS_MAX_CHANNELS)
+  {
+    printk( KERN_ERR "proslic_channel_count max is: %d, got: %d\n", SILABS_MAX_CHANNELS, proslic_channel_count);
+    return -EINVAL;
+  }
+  
+  rc = proslic_spi_setup();
+
+  if(rc == 0)
+  {
+    /* TODO: any other init we may want tot do here... */
+  }
+  else
+  {
+    printk( KERN_ERR "proslic_spi_setup returned: %d\n", rc);
+    return rc;
+  }
+
+  return 0;
+
+}
+
+void cleanup_module(void)
+{
+  proslic_spi_shutdown();
+  printk( KERN_INFO "ProSLIC API system services module unloaded.\n");
+}
+
+MODULE_DESCRIPTION(DRIVER_DESCRIPTION);
+MODULE_AUTHOR(DRIVER_AUTHOR);
+MODULE_LICENSE("Dual MPL/GPL"); 
+
+EXPORT_SYMBOL(proslic_spi_if);
+EXPORT_SYMBOL(proslic_timer_if);
+EXPORT_SYMBOL(proslic_get_channel_count);
+EXPORT_SYMBOL(proslic_get_device_type);
+EXPORT_SYMBOL(proslic_get_hCtrl);
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/proslic_sys_spi.c b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/proslic_sys_spi.c
new file mode 100644
index 0000000..101c486
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/proslic_sys_spi.c
@@ -0,0 +1,698 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include <linux/module.h>
+#include <linux/spi/spi.h>
+#include <linux/spinlock.h>
+#include <linux/of_gpio.h>
+#include <linux/gpio.h>
+#include <linux/delay.h>
+
+#include "proslic_sys.h"
+
+/*****************************************************************************************************/
+
+#define PROSLIC_REG_ID         0
+#define PROSLIC_REG_RAM_WAIT   4
+#define PROSLIC_REG_RAM_HI     5 
+#define PROSLIC_REG_RAM_D0     6
+#define PROSLIC_REG_RAM_D1     7
+#define PROSLIC_REG_RAM_D2     8
+#define PROSLIC_REG_RAM_D3     9
+#define PROSLIC_REG_RAM_LO     10
+#define PROSLIC_REG_WRVSLIC    12
+#define PROSLIC_REG_WRVDAA     34
+#define PROSLIC_REG_ISDAA      11
+
+#define PROSLIC_CW_BYTE        0
+#define PROSLIC_REG_BYTE       1
+#define RAM_ADR_HIGH_MASK(ADDR) (((ADDR)>>3)&0xE0)
+
+/* Basic register definitions, regardless of chipset ('4x, '2x, '17x, '26x compatible */
+
+#define PROSLIC_CW_RD          0x60
+#define PROSLIC_CW_WR          0x20
+#define PROSLIC_CW_BCAST       0x80
+#define PROSLIC_BCAST          0xFF
+
+#ifndef PROSLIC_XFER_BUF
+#define PROSLIC_XFER_BUF (SILABS_BITS_PER_WORD/8)
+#endif
+
+/* Now do some sanity checks */
+#if (SILABS_BITS_PER_WORD != 32) && (SILABS_BITS_PER_WORD != 16) && (SILABS_BITS_PER_WORD != 8)
+#error "SILABS_BITS_PER_WORD needs to be either 8, 16 or 32"
+#endif
+
+#if (((SILABS_BITS_PER_WORD == 16) && (PROSLIC_XFER_BUF != 2) ) \
+    || ((SILABS_BITS_PER_WORD == 32) && (PROSLIC_XFER_BUF != 4) ) ) 
+#error "SILABS_BITS_PER_WORD & PROSLIC_XFER_BUF size mismatch"
+#endif
+
+#if (SILABS_BITS_PER_WORD != 8)
+#define SILABS_CW_BYTE   1
+#define SILABS_REG_BYTE 0
+#else
+#define SILABS_CW_BYTE   0
+#define SILABS_REG_BYTE 1
+#endif
+
+typedef struct 
+{
+  proslic_dev_t deviceType[SILABS_MAX_CHANNELS];  
+  spinlock_t bus_lock;
+  uInt8 channel_count; /* In most cases this is the channel count as well */
+} proslic_spi_data_t;
+
+typedef struct
+{
+  /* Placeholder for now */
+} proslic_spi_pform_t;
+
+/* Chan address is sent in reverse bit order */
+static uInt8 chanAddr[SILABS_MAX_CHAN] =
+{
+  0x00, 0x10, 
+#if (SILABS_MAX_CHAN > 2)
+  0x08, 0x18,
+#endif
+#if (SILABS_MAX_CHAN > 4)
+  0x04, 0x14, 
+#endif
+#if (SILABS_MAX_CHAN > 6)
+  0x0C, 0x1C,
+#endif
+#if (SILABS_MAX_CHAN > 8)
+  0x02, 0x12, 
+#endif
+#if (SILABS_MAX_CHAN > 10)
+  0x0A, 0x1A,
+#endif
+#if (SILABS_MAX_CHAN > 12)
+  0x06, 0x16, 
+#endif
+#if (SILABS_MAX_CHAN > 14)
+  0x0E, 0x1E,
+#endif
+#if (SILABS_MAX_CHAN > 16)
+  0x01, 0x11,
+#endif
+#if (SILABS_MAX_CHAN > 18)
+  0x09, 0x19,
+#endif
+#if (SILABS_MAX_CHAN > 20)
+  0x05, 0x15,
+#endif
+#if (SILABS_MAX_CHAN > 22)
+  0x0D, 0x1D,
+#endif
+#if (SILABS_MAX_CHAN > 24)
+  0x03, 0x13,
+#endif
+#if (SILABS_MAX_CHAN > 26)
+  0x0B, 0x1B,
+#endif
+#if (SILABS_MAX_CHAN > 28)
+  0x07,0x17,
+#endif
+#if (SILABS_MAX_CHAN > 30)
+  0x0F, 0x1F
+#endif
+};
+
+static proslic_spi_data_t   *proslic_data;
+static unsigned int proslic_reset_gpio = SILABS_RESET_GPIO;
+struct spi_driver *proslic_spi;  
+struct spi_device *proslic_spidev;
+
+/*****************************************************************************************************/
+uInt8 proslic_read_register_private(void *hCtrl, uInt8 channel, uInt8 regAddr)
+{
+  u_int8_t data_stream[4];
+//  proslic_spi_data_t *spi_data = (proslic_spi_data_t *)hCtrl;
+  if (proslic_spidev == NULL)
+   	printk ("%s : small spi NULL\n",__FUNCTION__);
+
+  if( unlikely(channel >= SILABS_MAX_CHANNELS) )
+  {
+    return PROSLIC_SPI_NOK;
+  }
+  else
+  {
+    data_stream[PROSLIC_CW_BYTE] = PROSLIC_CW_RD | chanAddr[channel];
+  }  
+
+  data_stream[PROSLIC_REG_BYTE] = regAddr;
+
+  data_stream[2] = 0xFF; /* Set the register to a non-zero value, just in case */
+#if (PROSLIC_XFER_BUF == 4) || (PROSLIC_XFER_BUF == 2)
+  spi_write_then_read(proslic_spidev, data_stream, 2, &data_stream[2], 2); /* In essence, 2 16 bit ops: 1 to send the request, 1 to get the data, needs to be 32 bit aligned. */
+  proslic_debug("%s(%d): chan = %u reg = %u data = 0x%02X", __FUNCTION__, __LINE__, channel, regAddr, data_stream[2]);
+#else
+  {
+    int i;
+    for(i = 0; i < 2; i++)
+    {
+      spi_write(proslic_spidev, &data_stream[i], 1);
+    }
+  }
+  spi_read(proslic_spidev, &data_stream[2], 1);
+#endif  
+
+  return data_stream[2];
+}
+
+/*****************************************************************************************************/
+
+uInt8 proslic_read_register(void *hCtrl, uInt8 channel, uInt8 regAddr)
+{
+  uInt8 data;
+  //unsigned long irqSettings;
+  //proslic_spi_data_t *spi_data = (proslic_spi_data_t *)hCtrl;
+  //spin_lock_irqsave(&spi_data->bus_lock, irqSettings);
+  data = proslic_read_register_private(hCtrl, channel, regAddr);
+  //spin_unlock_irqrestore(&spi_data->bus_lock, irqSettings);
+  proslic_debug("%s(%d): chan = %u reg = %u data = 0x%02X", __FUNCTION__, __LINE__, channel, regAddr, data);
+  return data;
+}
+EXPORT_SYMBOL(proslic_read_register);
+
+
+/*****************************************************************************************************/
+/* ProSLIC API register write function */
+#if PROSLIC_XFER_BUF == 4
+#define proslic_write_register_private proslic_write_register
+#endif
+
+int proslic_write_register_private(void *hCtrl, uInt8 channel, uInt8 regAddr, uInt8 data)
+{
+  u_int8_t data_stream[4];
+  //struct spi_device *spi_data = (struct spi_device *)hCtrl;
+
+#if PROSLIC_XFER_BUF != 4
+  int i;
+#endif
+
+  if( unlikely(channel == PROSLIC_BCAST) )
+  {
+    data_stream[PROSLIC_CW_BYTE] = PROSLIC_CW_BCAST | PROSLIC_CW_WR;
+  }
+  else if( unlikely(channel >= SILABS_MAX_CHANNELS) )
+  {
+    return PROSLIC_SPI_NOK;
+  }
+  else
+  {
+    data_stream[PROSLIC_CW_BYTE] = PROSLIC_CW_WR | chanAddr[channel];
+  }  
+
+  proslic_trace("%s(%d): chan = %u reg = %u data = 0x%02X", __FUNCTION__, __LINE__, channel, regAddr, data);
+
+  data_stream[PROSLIC_REG_BYTE] = regAddr;
+
+  data_stream[2] = data_stream[3] = data;
+
+#if PROSLIC_XFER_BUF == 4
+  spi_write(proslic_spidev, data_stream, PROSLIC_XFER_BUF);
+#else
+#if PROSLIC_XFER_BUF == 2 /* 16 bit mode */
+  for(i = 0; i < 4; i+=2)
+#else /* Byte by byte */
+  for(i = 0; i < 3; i++)
+#endif
+  {
+    spi_write(proslic_spidev, &data_stream[i], PROSLIC_XFER_BUF);
+  }
+#endif  
+
+  return PROSLIC_SPI_OK;
+}
+/*****************************************************************************************************/
+#if PROSLIC_XFER_BUF != 4
+int proslic_write_register(void *hCtrl, uInt8 channel, uInt8 regAddr, uInt8 data)
+{
+  unsigned long irqSettings;
+  int rc;
+  //proslic_spi_data_t *spi_data = (proslic_spi_data_t *)hCtrl;
+  //spin_lock_irqsave(&spi_data->bus_lock, irqSettings);
+  rc  = proslic_write_register_private(hCtrl, channel, regAddr, data);
+  //spin_unlock_irqrestore(&spi_data->bus_lock, irqSettings);
+  return rc;
+}
+EXPORT_SYMBOL(proslic_write_register);
+#endif
+
+/*****************************************************************************************************/
+
+/* 
+ * wait for RAM access
+ *
+ * return code 0 = OK
+ *
+ */
+
+static int wait_ram(void *hCtrl, uInt8 channel)
+{
+  unsigned int count = SILABS_MAX_RAM_WAIT;
+  uInt8 data;
+
+  do
+  { 
+    data = proslic_read_register_private(hCtrl, channel, PROSLIC_REG_RAM_WAIT) & 0x1;
+    if(unlikely(data))
+    {
+     mdelay(5);
+    }  
+  }while((data) && (count--));
+
+  if(likely(count))
+  {
+    return 0;
+  }
+  return -1; /* Timed out */
+}
+
+/*****************************************************************************************************/
+/* RAM Write wrapper */
+int proslic_write_ram(void *hCtrl, uInt8 channel, uInt16 ramAddr, ramData data )
+{
+
+  ramData myData = data;
+  int rc = 0;
+  //unsigned long irqSettings;
+  //struct spi_device *spi_data = (struct spi_device *)hCtrl;
+  hCtrl = proslic_spidev;
+
+  proslic_trace("%s(%d): chan = %u ram = %u data = 0x%08X", __FUNCTION__, __LINE__, channel, ramAddr, data);
+  //spin_lock_irqsave(&spi_data->bus_lock, irqSettings);
+
+  if(wait_ram(hCtrl,channel) != 0)
+  {
+    return PROSLIC_SPI_NOK;
+  }
+
+ 
+#ifdef SILABS_RAM_BLOCK_ACCESS
+  {
+    uInt8 ramWriteData[24]; /* This encapsulates the 6 reg writes into 1 block */
+    const uInt8 regAddr[6] = {PROSLIC_REG_RAM_HI, PROSLIC_REG_RAM_D0, PROSLIC_REG_RAM_D1, 
+                              PROSLIC_REG_RAM_D2, PROSLIC_REG_RAM_D3, PROSLIC_REG_RAM_LO};
+    int i;
+    uInt8 scratch;
+
+    /* Setup control word & registers for ALL the reg access */
+    scratch = chanAddr[channel] | PROSLIC_CW_WR;
+
+    for(i = 0; i < 6; i++)
+    {
+      ramWriteData[(i<<2)]       = scratch ; 
+      ramWriteData[(i<<2)+1]     = regAddr[i];
+    }
+
+    /* For the data, we send the same byte twice to keep things 32 bit aligned */
+    ramWriteData[2] = ramWriteData[3] = RAM_ADR_HIGH_MASK(ramAddr);
+
+    ramWriteData[6] = ramWriteData[7] = (uInt8)(myData<<3);
+    myData = myData >> 5;
+
+    ramWriteData[10] = ramWriteData[11] = (uInt8)(myData & 0xFF);
+    myData = myData >> 8;
+
+    ramWriteData[14] = ramWriteData[15] = (uInt8)(myData & 0xFF);
+    myData = myData >> 8;
+
+    ramWriteData[18] = ramWriteData[19] = (uInt8)(myData & 0xFF);
+
+    ramWriteData[22] = ramWriteData[23] = (uInt8)(ramAddr& 0xFF);
+
+    spi_write(hCtrl, ramWriteData, 24);
+    
+  }
+#else
+  proslic_write_register_private(hCtrl, channel, RAM_ADDR_HI, RAM_ADR_HIGH_MASK(ramAddr));
+
+  proslic_write_register_private(hCtrl, channel, RAM_DATA_B0, ((unsigned char)(myData<<3)));
+ 
+  myData = myData >> 5;
+
+  proslic_write_register_private(hCtrl, channel, RAM_DATA_B1, ((unsigned char)(myData & 0xFF)));
+
+  myData = myData >> 8;
+  
+  proslic_write_register_private(hCtrl, channel, RAM_DATA_B2, ((unsigned char)(myData & 0xFF)));
+
+  myData = myData >> 8;
+  
+  proslic_write_register_private(hCtrl, channel, RAM_DATA_B3, ((unsigned char)(myData & 0xFF)));
+
+  proslic_write_register_private(hCtrl, channel, RAM_ADDR_LO, (unsigned char)(ramAddr & 0xFF));
+#endif
+  if(wait_ram(hCtrl,channel) != 0)
+  {
+    rc = PROSLIC_SPI_NOK;
+  }
+  else
+  {
+    rc = PROSLIC_SPI_OK;
+  }
+  //spin_unlock_irqrestore(&spi_data->bus_lock, irqSettings);
+
+  return rc;
+  
+}
+EXPORT_SYMBOL(proslic_write_ram);
+
+/*****************************************************************************************************/
+ramData proslic_read_ram(void *hCtrl, uInt8 channel, uInt16 ramAddr)
+{
+  ramData data;
+  //unsigned long irqSettings;
+  //proslic_spi_data_t *spi_data = (proslic_spi_data_t *)hCtrl;
+  hCtrl = proslic_spidev;
+
+  if(wait_ram(hCtrl,channel) != 0)
+  {
+    return PROSLIC_SPI_NOK;
+  }
+
+  //spin_lock_irqsave(&spi_data->bus_lock, irqSettings);
+  /* TODO: could combine these 2 writes into 1 spi_write call... */
+  proslic_write_register_private(hCtrl, channel, PROSLIC_REG_RAM_HI, RAM_ADR_HIGH_MASK(ramAddr));
+
+  proslic_write_register_private(hCtrl, channel, PROSLIC_REG_RAM_LO, (unsigned char)(ramAddr&0xFF));
+
+  if(wait_ram(hCtrl,channel) != 0)
+  {
+    return PROSLIC_SPI_NOK;
+  }
+
+  data = proslic_read_register_private(hCtrl, channel, PROSLIC_REG_RAM_D3);
+  data = data << 8;
+  data |= proslic_read_register_private(hCtrl, channel, PROSLIC_REG_RAM_D2);
+  data = data << 8;
+  data |= proslic_read_register_private(hCtrl, channel, PROSLIC_REG_RAM_D1);
+  data = data << 8;
+  data |= proslic_read_register_private(hCtrl, channel, PROSLIC_REG_RAM_D0);
+  //spin_unlock_irqrestore(&spi_data->bus_lock, irqSettings);
+ 
+  data = data >>3;
+
+  proslic_trace("%s(%d): chan = %u ram = %u data = 0x%08X", __FUNCTION__, __LINE__, channel, ramAddr, data);
+
+  return data;
+
+}
+EXPORT_SYMBOL(proslic_read_ram);
+
+/*****************************************************************************************************/
+int proslic_reset(void *hCtrl, int in_reset)
+{
+  proslic_trace("%s(%d): in_reset = %d", __FUNCTION__, __LINE__, in_reset);
+  gpio_direction_output(proslic_reset_gpio, (in_reset == 0) );
+
+  return PROSLIC_SPI_OK;
+}
+EXPORT_SYMBOL(proslic_reset);
+
+/*****************************************************************************************************/
+
+/*
+ * Do a simple write/verify test on a given register.  0 = OK.
+ */
+static int simple_wrv(void *hCtrl, uInt8 channel, uInt8 regAddr)
+{
+  uInt8 data;
+
+  proslic_write_register(hCtrl, channel, regAddr, 0);
+  data = proslic_read_register(hCtrl, channel, regAddr);
+  if(unlikely(data != 0) )
+  {
+    return -1;
+  }
+
+  proslic_write_register(hCtrl, channel, regAddr, 0x5A);
+  data = proslic_read_register(hCtrl, channel, regAddr);
+  if(unlikely(data != 0x5A) )
+  {
+    return -2;
+  }
+
+  return 0;
+}
+
+/*****************************************************************************************************/
+
+/* 
+ * Determine if this a ProSLIC or DAA or unknown type - NOT fully tested against ALL chipsets, may not
+ * properly work with Si3218/9 parts.
+ */
+static proslic_dev_t proslic_detect_type(void *hCtrl, uInt8 channel)
+{
+  /* Guess it's a ProSLIC first */
+  uInt8 data;
+
+  data = proslic_read_register(hCtrl, channel, PROSLIC_REG_ISDAA);
+  proslic_debug("%s(%d): channel = %d data = 0x%0X", __FUNCTION__, __LINE__, channel, data);
+
+  /* For ProSLIC ISDAA = 5, for DAA it is not (it is non-zero and not FF */
+
+  if( unlikely((data != 0xFF) && data ))
+  {
+    /* Likely a ProSLIC, let's confirm it by doing a few register write/verify operations */
+    if( data == 5) 
+    {
+      if(unlikely(simple_wrv(hCtrl, channel, PROSLIC_REG_WRVSLIC) == 0))
+      {
+        proslic_debug("%s(%d): channel = %d is_proslic", __FUNCTION__, __LINE__, channel);
+        return PROSLIC_IS_PROSLIC;
+      }
+    }
+    else /* Likely a DAA/Si3050 device */
+    {
+      if(unlikely(simple_wrv(hCtrl, channel, PROSLIC_REG_WRVDAA) == 0))
+      {
+        proslic_debug("%s(%d): channel = %d is_daa", __FUNCTION__, __LINE__, channel);
+        return PROSLIC_IS_DAA;
+      }
+    }
+  }
+
+  proslic_debug("%s(%d): channel = %d is_unknown", __FUNCTION__, __LINE__, channel);
+  return PROSLIC_IS_UNKNOWN;
+}
+
+/*****************************************************************************************************/
+/*  Pull in any device tree parameters */
+#ifdef CONFIG_OF
+static void proslic_of_probe(struct spi_device *spi)
+{
+  int len;
+  const __be32 *property;
+  u8 scratch;
+
+  printk(KERN_INFO "proslic_of_probe()\n");
+ 
+  /* see if the user specified number of channels */
+  property = of_get_property( spi->dev.of_node, "channel_count", &len); 
+
+  if(property && (len >= sizeof(__be32)) )
+  {
+    scratch = be32_to_cpup(property);
+
+    if(( scratch <= SILABS_MAX_CHANNELS ) 
+      && (scratch > 0) )
+    {
+        proslic_channel_count = scratch;
+    }
+  }
+
+  /* See if the user specified a debug setting */
+  property = of_get_property( spi->dev.of_node, "debug_level", &len); 
+
+  if(property && (len >= sizeof(__be32)) )
+  {
+    scratch = be32_to_cpup(property);
+
+    if(( scratch <= SILABS_DEFAULT_DBG ) 
+      && (scratch > 0) )
+    {
+        proslic_debug_setting = scratch;
+  	printk(KERN_INFO "debug_level = %d\n", proslic_debug_setting);
+    }
+  }
+
+  printk(KERN_INFO "[previous]reset_gpio = %d\n", proslic_reset_gpio);
+  proslic_reset_gpio =
+	  of_get_named_gpio(spi->dev.of_node, "reset_gpio", 0);
+
+  printk(KERN_INFO "reset_gpio = %d\n", proslic_reset_gpio);
+}
+#endif
+
+/*****************************************************************************************************/
+int proslic_spi_probe(struct spi_device *spi, struct spi_driver *spi_drv)
+{
+  proslic_spi_pform_t *pform_data;
+  unsigned int channel;
+  int rc;
+
+  printk(KERN_INFO "PROSLIC module being probed\n");
+
+  proslic_spi = spi_drv;
+  pform_data = (proslic_spi_pform_t *) &(spi->dev.platform_data);
+
+#ifdef CONFIG_OF
+  proslic_of_probe(spi);
+#endif
+
+  rc = gpio_request(proslic_reset_gpio,"proslic_reset");
+  if(rc == 0)
+  {
+    printk(KERN_INFO "PROSLIC GPIO registered OK");
+    gpio_export( proslic_reset_gpio, 0);
+    proslic_reset(NULL, 0);
+  }
+  else
+  {
+    printk(KERN_INFO "PROSLIC GPIO registered FAil!! rc = %d", rc);
+    return -ENODEV;
+  }
+
+  if(unlikely(!pform_data))
+  {
+    return -ENODEV;
+  }
+
+  proslic_data = kzalloc(sizeof(*proslic_data), GFP_KERNEL);
+
+  if(unlikely(!proslic_data))
+  {
+    return -ENOMEM;
+  }
+
+  spin_lock_init(&(proslic_data->bus_lock));
+  proslic_spidev = spi;
+#ifdef CONFIG_OF 
+  spi->bits_per_word = SILABS_BITS_PER_WORD; 
+  spi->max_speed_hz =  SILABS_SPI_RATE;
+  spi->mode = SPI_MODE_3;
+  if( spi_setup(spi) != 0)
+  {
+    printk(KERN_ERR PROSLIC_API_HDR "failed to configure spi mode");
+    kfree(proslic_data);
+    return -EIO;
+  }
+#endif
+  spi_set_drvdata(spi, proslic_data);
+
+  /* Probe to determine the number of DAA's or ProSLIC's present */
+  for(channel = 0; channel < proslic_channel_count; channel++)
+  {
+    proslic_data->deviceType[channel] = proslic_detect_type(proslic_spidev, channel);
+    if( proslic_data->deviceType[channel] != PROSLIC_IS_UNKNOWN)
+    {
+      proslic_data->channel_count++;
+    }
+  }
+
+  if(proslic_data->channel_count)
+  {
+    return 0;
+  }
+  else
+  {
+    return -ENXIO;
+  }
+}
+EXPORT_SYMBOL(proslic_spi_probe);
+
+/*****************************************************************************************************/
+int proslic_spi_remove(struct spi_device *spi)
+{
+  void *ptr;
+
+  printk(KERN_INFO "ProSLIC module being removed");
+  /* Just put the device(s) into reset - assumes 1 reset per SPI device */
+  proslic_reset(NULL, 1);
+
+  ptr = spi_get_drvdata(spi);
+  if(ptr != NULL)
+  {
+    kfree(ptr);
+  }
+
+  return 0;
+}
+EXPORT_SYMBOL(proslic_spi_remove);
+
+/*****************************************************************************************************/
+int proslic_spi_setup()
+{
+  int rc;
+  printk(KERN_INFO "proslic_spi_setup()\n");
+
+  rc = spi_register_driver(proslic_spi);
+
+  if(rc != 0)
+  {
+    proslic_error("%s(%d): spi_register driver returned = %d", __FUNCTION__, __LINE__, rc);
+  }
+  else
+  {
+    proslic_debug("%s(%d): spi driver registered", __FUNCTION__, __LINE__);
+  }
+
+  proslic_trace("%s(%d): completed", __FUNCTION__, __LINE__);
+  return rc;
+}
+
+
+void proslic_spi_shutdown()
+{
+  spi_unregister_driver(proslic_spi);
+  gpio_unexport( proslic_reset_gpio );
+  gpio_free( proslic_reset_gpio );
+}
+/*****************************************************************************************************/
+int proslic_get_channel_count()
+{
+  return proslic_data->channel_count;
+}
+
+proslic_dev_t proslic_get_device_type(uint8_t channel_number)
+{
+  if(channel_number < proslic_data->channel_count)
+  {
+    return proslic_data->deviceType[channel_number];
+  }
+  else
+  {
+    return PROSLIC_IS_UNKNOWN;
+  }
+}
+
+void *proslic_get_hCtrl(uint8_t channel)
+{
+  if(channel < proslic_data->channel_count)
+  {
+    return proslic_data;
+  }
+  else
+  {
+    return NULL;
+  }
+}
+
+/*****************************************************************************************************/
+proslic_spi_fptrs_t proslic_spi_if = 
+{
+  proslic_reset, 
+
+  proslic_write_register,
+  proslic_write_ram,
+
+  proslic_read_register,
+  proslic_read_ram,
+
+  NULL, /* semaphore */
+
+};
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/proslic_sys_timer.c b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/proslic_sys_timer.c
new file mode 100644
index 0000000..7c1ca1b
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/proslic_sys_timer.c
@@ -0,0 +1,62 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include <linux/delay.h>
+#include <linux/ktime.h>
+#include <linux/timekeeping.h>
+
+#include "proslic_sys.h"
+
+/*****************************************************************************************************/
+static int proslic_sys_delay(void *hTimer, int timeInMsec)
+{
+	if(likely(timeInMsec < SILABS_MIN_MSLEEP_TIME))
+	{
+		mdelay(timeInMsec);
+	}
+	else
+	{
+		msleep((timeInMsec-SILABS_MSLEEP_SLOP));
+	}
+	return PROSLIC_SPI_OK;
+}
+
+/*****************************************************************************************************/
+/* Code assumes time value has been allocated */
+static int proslic_sys_getTime(void *hTimer, void *time)
+{
+	if(time != NULL)
+	{
+		ktime_get_coarse_real_ts64(&((proslic_timeStamp *)time)->timerObj);
+		return PROSLIC_SPI_OK;
+	}
+	else
+	{
+		return PROSLIC_TIMER_ERROR;
+	}
+}
+/*****************************************************************************************************/
+ 
+static int proslic_sys_timeElapsed(void *hTimer, void *startTime, int *timeInMsec)
+{
+	if( (startTime != NULL) && (timeInMsec != NULL) )
+	{
+		struct timespec64 now;
+		struct timespec64 ts_delta;
+		ktime_get_coarse_real_ts64(&now);
+		ts_delta = timespec64_sub(now, (((proslic_timeStamp *) startTime)->timerObj));
+		*timeInMsec = (int)( (ts_delta.tv_sec *1000) + (ts_delta.tv_nsec / NSEC_PER_MSEC) );
+		return PROSLIC_SPI_OK;
+	}
+	else
+	{
+		return PROSLIC_TIMER_ERROR;
+	}
+}
+
+
+proslic_timer_fptrs_t proslic_timer_if =
+{
+	proslic_sys_delay,
+	proslic_sys_timeElapsed,
+	proslic_sys_getTime
+};
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/proslic_timer_intf_linux.c b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/proslic_timer_intf_linux.c
new file mode 100644
index 0000000..208a0df
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/proslic_timer_intf_linux.c
@@ -0,0 +1,91 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * $Id: proslic_timer_intf_win.c 109 2008-10-22 19:45:09Z lajordan@SILABS.COM $
+ *
+ * system.c
+ * System specific functions implementation file
+ *
+ * Author(s): 
+ * laj
+ *
+ * Distributed by: 
+ * Silicon Laboratories, Inc
+ *
+ * File Description:
+ * This is the implementation file for the system specific functions like timer functions.
+ *
+ * Dependancies:
+ * datatypes.h
+ *
+ */
+#include "config_inc/si_voice_datatypes.h"
+#include "inc/si_voice_timer_intf.h"
+#include <linux/time.h>
+#include <linux/timer.h>
+#include <linux/delay.h>
+#include "timer.h"
+//#include <asm/div64.h>
+#
+/*
+** Function: SYSTEM_TimerInit
+*/
+void TimerInit (systemTimer_S *pTimerObj){
+
+}
+
+
+/*
+** Function: SYSTEM_Delay
+*/
+int time_DelayWrapper (void *hTimer, int timeInMs){
+	mdelay(timeInMs);
+	return 0;
+}
+
+
+/*
+** Function: SYSTEM_TimeElapsed
+*/
+int time_TimeElapsedWrapper (void *hTimer, void *startTime, int *timeInMs){	*timeInMs = 1000;
+	return 0;
+}
+
+/*
+** Function: SYSTEM_GetTime
+*/
+int time_GetTimeWrapper (void *hTimer, void *time){
+//	time->timestamp=0;
+	return 0;
+}
+
+/*
+** $Log: proslic_timer_intf_win.c,v $
+** Revision 1.5  2008/07/24 21:06:16  lajordan
+** no message
+**
+** Revision 1.4  2007/03/22 18:53:43  lajordan
+** fixed warningg
+**
+** Revision 1.3  2007/02/26 16:46:16  lajordan
+** cleaned up some warnings
+**
+** Revision 1.2  2007/02/16 23:55:07  lajordan
+** no message
+**
+** Revision 1.1.1.1  2006/07/13 20:26:08  lajordan
+** no message
+**
+** Revision 1.1  2006/07/07 21:38:56  lajordan
+** no message
+**
+** Revision 1.1.1.1  2006/07/06 22:06:23  lajordan
+** no message
+**
+** Revision 1.1  2006/06/29 19:17:21  laj
+** no message
+**
+** Revision 1.1  2006/06/21 22:42:26  laj
+** new api style
+**
+**
+*/
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/si3218x.c b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/si3218x.c
new file mode 100644
index 0000000..efb6818
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/si3218x.c
@@ -0,0 +1,355 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include <linux/module.h>
+#include <linux/init.h>
+
+
+#include <linux/kernel.h>
+#include <linux/err.h>
+#include <linux/delay.h>
+
+#include <linux/regmap.h>
+#include <linux/spi/spi.h>
+
+
+#include <sound/core.h>
+#include <sound/pcm.h>
+#include <sound/pcm_params.h>
+#include <sound/soc.h>
+#include <sound/tlv.h>
+
+#include "proslic_sys.h"
+#include "si3218x.h"
+#include "inc/proslic.h"
+#include "timer.h"
+
+#include "spi.h"
+
+#ifdef SI3218X
+#include "inc/si3218x.h"
+#include "inc/si3218x_intf.h"
+#endif
+
+#define NUMBER_OF_DEVICES 1
+#if defined(SI3218X)
+#define CHAN_PER_DEVICE 1
+#define NUMBER_OF_CHAN (NUMBER_OF_DEVICES*CHAN_PER_DEVICE)
+#define NUMBER_OF_PROSLIC (NUMBER_OF_CHAN)
+#define PROSLIC_DEVICE_TYPE SI3218X_TYPE
+#endif
+
+static int slic_init = 0;
+
+ctrl_S spiGciObj; /* User¡¦s control interface object */
+systemTimer_S timerObj; /* User¡¦s timer object */
+chanState ports[NUMBER_OF_CHAN]; /* User¡¦s channel object, which has
+				  ** a member defined as
+				  ** proslicChanType_ptr ProObj;
+				 */
+/* Define ProSLIC control interface object */
+controlInterfaceType *ProHWIntf;
+/* Define array of ProSLIC device objects */
+ProslicDeviceType *ProSLICDevices[NUMBER_OF_PROSLIC];
+/* Define array of ProSLIC channel object pointers */
+proslicChanType_ptr arrayOfProslicChans[NUMBER_OF_CHAN];
+
+static int ProSLIC_HWInit(void)
+{
+	int32 i, result= 0;
+
+	printk ("%s()\n",__FUNCTION__);
+	/*
+	** Step 1: (required)
+	** Create ProSLIC Control Interface Object
+	*/
+	ProSLIC_createControlInterface(&ProHWIntf);
+
+	/*
+	** Step 2: (required)
+	** Create ProSLIC Device Objects
+	*/
+	for(i=0;i<NUMBER_OF_PROSLIC;i++)
+	{
+		ProSLIC_createDevice(&(ProSLICDevices[i]));
+	}
+
+	/*
+	** Step 3: (required)
+	** Create and initialize ProSLIC channel objects
+	** Also initialize array pointers to user¡¦s proslic channel object
+	** members to simplify initialization process.
+	*/
+	for(i=0;i<NUMBER_OF_CHAN;i++)
+	{
+		ProSLIC_createChannel(&(ports[i].ProObj));
+		ProSLIC_SWInitChan(ports[i].ProObj,i,PROSLIC_DEVICE_TYPE,
+		ProSLICDevices[i/CHAN_PER_DEVICE],ProHWIntf);
+		arrayOfProslicChans[i] = ports[i].ProObj;
+		ProSLIC_setSWDebugMode(ports[i].ProObj,TRUE); /* optional */
+	}
+
+	/*
+	** Step 4: (required)
+	** Establish linkage between host objects/functions and
+	** ProSLIC API
+	*/
+	ProSLIC_setControlInterfaceCtrlObj (ProHWIntf, &spiGciObj);
+	ProSLIC_setControlInterfaceReset (ProHWIntf, ctrl_ResetWrapper);
+	ProSLIC_setControlInterfaceWriteRegister (ProHWIntf, ctrl_WriteRegisterWrapper);
+	ProSLIC_setControlInterfaceReadRegister (ProHWIntf, ctrl_ReadRegisterWrapper);
+	ProSLIC_setControlInterfaceWriteRAM (ProHWIntf, ctrl_WriteRAMWrapper);
+	ProSLIC_setControlInterfaceReadRAM (ProHWIntf, ctrl_ReadRAMWrapper);
+	ProSLIC_setControlInterfaceTimerObj (ProHWIntf, &timerObj);
+	ProSLIC_setControlInterfaceDelay (ProHWIntf, time_DelayWrapper);
+	ProSLIC_setControlInterfaceTimeElapsed (ProHWIntf, time_TimeElapsedWrapper);
+	ProSLIC_setControlInterfaceGetTime (ProHWIntf, time_GetTimeWrapper);
+	ProSLIC_setControlInterfaceSemaphore (ProHWIntf, NULL);
+
+	/*
+	** Step 5: (system dependent)
+	** Assert hardware Reset ¡V ensure VDD, PCLK, and FSYNC are present and stable
+	** before releasing reset
+	*/
+	ProSLIC_Reset(ports[0].ProObj);
+
+	/*
+	** Step 6: (required)
+	** Initialize device (loading of general parameters, calibrations,
+	** dc-dc powerup, etc.)
+	*/
+	ProSLIC_Init(arrayOfProslicChans,NUMBER_OF_CHAN);
+	for(i=0;i<NUMBER_OF_CHAN;i++)
+	{
+		if(arrayOfProslicChans[i]->error!=0)
+		{
+			printk("ProSLIC_Init[%d] ERR=%d\n",i,arrayOfProslicChans[i]->error);
+			return 0;
+		}
+	}
+
+
+	/*
+	** Step 7: (design dependent)
+	** Execute longitudinal balance calibration
+	** or reload coefficients from factory LB cal
+	**
+	** Note: all batteries should be up and stable prior to
+	** executing the lb cal
+	*/
+	ProSLIC_LBCal(arrayOfProslicChans,NUMBER_OF_CHAN);
+	for(i=0;i<NUMBER_OF_CHAN;i++)
+	{
+		ProSLIC_GetLBCalResultPacked(arrayOfProslicChans[i], &result);
+		printk("LBCal=0x%08X\n",result);
+	}
+
+	/*
+	** Step 8: (design dependent)
+	** Load custom configuration presets(generated using
+	** ProSLIC API Config Tool)
+	*/
+	for(i=0;i<NUMBER_OF_CHAN;i++)
+	{
+		ProSLIC_PCMTimeSlotSetup(ports[i].ProObj,0,0);
+		ProSLIC_DCFeedSetup(ports[i].ProObj,DCFEED_48V_20MA);
+		ProSLIC_RingSetup(ports[i].ProObj,RING_F20_45VRMS_0VDC_LPR);
+		ProSLIC_PCMSetup(ports[i].ProObj,PCM_16LIN_WB); /* PCM_DEFAULT_CONFIG */
+		ProSLIC_ZsynthSetup(ports[i].ProObj,ZSYN_600_0_0_30_0);
+		ProSLIC_ToneGenSetup(ports[i].ProObj,TONEGEN_FCC_DIAL);
+	}
+
+	for(i=0;i<NUMBER_OF_CHAN;i++)
+	{
+		ProSLIC_PCMStart(ports[i].ProObj);
+	}
+	for(i=0;i<NUMBER_OF_CHAN;i++)
+	{
+		ProSLIC_SetLinefeedStatus(ports[i].ProObj,LF_FWD_ACTIVE);
+	}
+
+	/*
+	** Step 9: (required)
+	** SLIC settings - set TX_START and RX_START to 1 and
+	** disable Free-Run mode.
+	*/
+	ProSLIC_WriteReg(ports[0].ProObj, 12, 1);
+	ProSLIC_WriteReg(ports[0].ProObj, 14, 1);
+	ProSLIC_WriteReg(ports[0].ProObj, 47, 1);
+
+	return 1;
+}
+
+static int si3218x_component_probe(struct snd_soc_component *component)
+{
+	dev_info(component->dev, "%s\n", __func__);
+	return 0;
+}
+
+static void si3218x_component_remove(struct snd_soc_component *component)
+{
+	struct si3218x_chip *chip = snd_soc_component_get_drvdata(component);
+
+	dev_info(component->dev, "%s\n", __func__);
+
+	chip->component = NULL;
+}
+
+static const struct snd_soc_dapm_widget si3218x_component_dapm_widgets[] = {
+	SND_SOC_DAPM_INPUT("VINP"),
+	SND_SOC_DAPM_OUTPUT("VOUTP"),
+};
+
+static const struct snd_soc_dapm_route si3218x_component_dapm_routes[] = {
+	{ "VOUTP", NULL, "aif_playback"},
+	{ "aif_capture", NULL, "VINP"},
+};
+
+static const char * const slic_control_str[] = {
+	"off", "on"
+};
+
+static const struct soc_enum si3218x_slic_enum[] = {
+	SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(slic_control_str),
+			    slic_control_str),
+};
+
+static int si3218x_init_get(struct snd_kcontrol *kcontrol,
+			     struct snd_ctl_elem_value *ucontrol)
+{
+	ucontrol->value.integer.value[0] = slic_init;
+
+	return 0;
+}
+
+static int si3218x_init_set(struct snd_kcontrol *kcontrol,
+			     struct snd_ctl_elem_value *ucontrol)
+{
+	if (ucontrol->value.integer.value[0]) {
+		ProSLIC_HWInit();
+		slic_init = 1;
+	}
+
+	return 0;
+}
+
+static int si3218x_ring_get(struct snd_kcontrol *kcontrol,
+			     struct snd_ctl_elem_value *ucontrol)
+{
+	if (!slic_init)
+		return 0;
+
+	ucontrol->value.integer.value[0] =
+		(ProSLIC_ReadReg(ports[0].ProObj,30) == 4) ? 1 : 0;
+	return 0;
+}
+
+static int si3218x_ring_set(struct snd_kcontrol *kcontrol,
+			     struct snd_ctl_elem_value *ucontrol)
+{
+	if (!slic_init)
+		return 0;
+
+	if (ucontrol->value.integer.value[0])
+		ProSLIC_WriteReg(ports[0].ProObj, 30, 4);
+	else
+		ProSLIC_WriteReg(ports[0].ProObj, 30, 1);
+
+	return 0;
+}
+
+static const struct snd_kcontrol_new si3218x_component_snd_controls[] = {
+	SOC_ENUM_EXT("proslic_init", si3218x_slic_enum[0],
+				     si3218x_init_get, si3218x_init_set),
+	SOC_ENUM_EXT("proslic_ring", si3218x_slic_enum[0],
+				     si3218x_ring_get, si3218x_ring_set),
+};
+
+static const struct snd_soc_component_driver si3218x_component_driver = {
+	.probe = si3218x_component_probe,
+	.remove = si3218x_component_remove,
+
+	.controls = si3218x_component_snd_controls,
+	.num_controls = ARRAY_SIZE(si3218x_component_snd_controls),
+	.dapm_widgets = si3218x_component_dapm_widgets,
+	.num_dapm_widgets = ARRAY_SIZE(si3218x_component_dapm_widgets),
+	.dapm_routes = si3218x_component_dapm_routes,
+	.num_dapm_routes = ARRAY_SIZE(si3218x_component_dapm_routes),
+
+	.idle_bias_on = false,
+};
+
+static int si3218x_component_aif_hw_params(struct snd_pcm_substream *substream,
+	struct snd_pcm_hw_params *hw_params, struct snd_soc_dai *dai)
+{
+	int word_len = params_physical_width(hw_params);
+	int aud_bit = params_width(hw_params);
+
+	dev_dbg(dai->dev, "format: 0x%08x\n", params_format(hw_params));
+	dev_dbg(dai->dev, "rate: 0x%08x\n", params_rate(hw_params));
+	dev_dbg(dai->dev, "word_len: %d, aud_bit: %d\n", word_len, aud_bit);
+	if (word_len > 32 || word_len < 16) {
+		dev_err(dai->dev, "not supported word length\n");
+		return -ENOTSUPP;
+	}
+
+	dev_dbg(dai->dev, "%s: --\n", __func__);
+	return 0;
+}
+
+static const struct snd_soc_dai_ops si3218x_component_aif_ops = {
+	.hw_params = si3218x_component_aif_hw_params,
+};
+
+#define STUB_RATES	SNDRV_PCM_RATE_8000_192000
+#define STUB_FORMATS	(SNDRV_PCM_FMTBIT_S16_LE | \
+			SNDRV_PCM_FMTBIT_U16_LE | \
+			SNDRV_PCM_FMTBIT_S24_LE | \
+			SNDRV_PCM_FMTBIT_U24_LE | \
+			SNDRV_PCM_FMTBIT_S32_LE | \
+			SNDRV_PCM_FMTBIT_U32_LE)
+
+static struct snd_soc_dai_driver si3218x_codec_dai = {
+	.name = "proslic_spi-aif",
+	.playback = {
+		.stream_name	= "aif_playback",
+		.channels_min	= 1,
+		.channels_max	= 2,
+		.rates		= STUB_RATES,
+		.formats	= STUB_FORMATS,
+	},
+	.capture = {
+		.stream_name	= "aif_capture",
+		.channels_min	= 1,
+		.channels_max	= 2,
+		.rates = STUB_RATES,
+		.formats = STUB_FORMATS,
+	},
+	/* dai properties */
+	.symmetric_rates = 1,
+	.symmetric_channels = 1,
+	.symmetric_samplebits = 1,
+	/* dai operations */
+	.ops = &si3218x_component_aif_ops,
+};
+
+int si3218x_spi_probe(struct spi_device *spi, struct spi_driver *spi_drv)
+{
+	int ret;
+
+	printk(KERN_INFO "PROSLIC si3218x_spi_probe\n");
+
+	ret = proslic_spi_probe(spi,spi_drv);
+
+	return snd_soc_register_component(&spi->dev, &si3218x_component_driver,
+				      &si3218x_codec_dai, 1);
+}
+EXPORT_SYMBOL(si3218x_spi_probe);
+
+int si3218x_spi_remove(struct spi_device *spi)
+{
+	proslic_spi_remove(spi);
+	snd_soc_unregister_component(&spi->dev);
+
+	return 0;
+}
+EXPORT_SYMBOL(si3218x_spi_remove);
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/si3218x.h b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/si3218x.h
new file mode 100644
index 0000000..5fa4d42
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/si3218x.h
@@ -0,0 +1,44 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#include <linux/spi/spi.h>
+#include "inc/proslic.h"
+#include "timer.h"
+#include "spi.h"
+
+#if 1
+#include "inc/si3218x.h"
+#include "inc/si3218x_intf.h"
+#include "config_inc/si3218x_LCCB_constants.h"
+#endif
+
+typedef struct chanStatus chanState; //forward declaration
+
+typedef void (*procState) (chanState *pState, ProslicInt eInput);
+
+/*
+** structure to hold state information for pbx demo
+*/
+struct chanStatus {
+        proslicChanType *ProObj;
+        SiVoiceChanType_ptr VoiceObj;
+        timeStamp onHookTime;
+        timeStamp offHookTime;
+        procState currentState;
+        uInt16 digitCount;
+        uInt8 digits[20];
+        uInt8 ringCount;
+        uInt16 connectionWith;
+        uInt16 powerAlarmCount;
+        pulseDialType pulseDialData;
+        BOOLEAN eventEnable;
+}  __attribute__((aligned(32)));
+
+struct si3218x_chip {
+	struct spi_device *spi;
+	struct device *dev;
+	struct snd_soc_component *component;
+};
+
+/* Export function */
+int si3218x_spi_probe(struct spi_device *spi, struct spi_driver *spi_drv);
+int si3218x_spi_remove(struct spi_device *spi);
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/spi.h b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/spi.h
new file mode 100644
index 0000000..b720f3f
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/spi.h
@@ -0,0 +1,83 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * $Id: SPI.h 109 2008-10-22 19:45:09Z lajordan@SILABS.COM $
+ * 
+ * This file is system specific and should be edited for your hardware platform
+ *
+ * This file is used by proslic_timer_intf.h and proslic_spiGci.h
+ */
+#ifndef SPI_TYPE_H
+#define SPI_TYPE_H
+
+/*
+** SPI/GCI structure
+*/
+typedef struct{
+	unsigned short portID;
+} ctrl_S;
+
+/*
+** Function: SPI_Init
+**
+** Description: 
+** Initializes the SPI interface
+*/
+int SPI_Init (ctrl_S *hSpi);
+
+
+/*
+** Function: ctrl_ResetWrapper
+**
+** Description: 
+** Sets the reset pin of the ProSLIC
+*/
+int ctrl_ResetWrapper (void *hCtrl, int status);
+
+/*
+** register read 
+**
+** Description: 
+** Reads ProSLIC registers
+*/
+unsigned char ctrl_ReadRegisterWrapper (void *hCtrl, unsigned char channel, unsigned char regAddr);
+
+/*
+** Function: ctrl_WriteRegisterWrapper
+**
+** Description: 
+** Writes ProSLIC registers
+*/
+int ctrl_WriteRegisterWrapper (void *hSpiGci, unsigned char channel, unsigned char regAddr, unsigned char data);
+
+/*
+** Function: ctrl_WriteRAMWrapper
+**
+** Description: 
+** Writes ProSLIC RAM
+*/
+int ctrl_WriteRAMWrapper (void *hSpiGci, unsigned char channel, unsigned short ramAddr, ramData data);
+
+/*
+** Function: ctrl_ReadRAMWrapper
+**
+** Description: 
+** Reads ProSLIC RAM
+*/
+ramData ctrl_ReadRAMWrapper  (void *hSpiGci, unsigned char channel, unsigned short ramAddr);
+
+#endif
+/*
+** $Log: SPI.h,v $
+** Revision 1.2  2007/02/21 16:53:07  lajordan
+** no message
+**
+** Revision 1.1  2007/02/16 23:55:15  lajordan
+** no message
+**
+** Revision 1.2  2007/02/15 23:33:25  lajordan
+** no message
+**
+** Revision 1.1.1.1  2006/07/13 20:26:08  lajordan
+** no message
+**
+*/
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/src/Makefile b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/src/Makefile
new file mode 100644
index 0000000..d9063fd
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/src/Makefile
@@ -0,0 +1,18 @@
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# 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.
+#
+
+# platform driver
+subdir-ccflags-y += -I../inc
+subdir-ccflags-y += -DSI3218X
+subdir-ccflags-y += -DPROSLIC_LINUX_KERNEL
+snd-soc-procslic-common-objs := proslic.o proslic_tstin.o si_voice.o si_voice_version.o si3218x_intf.o vdaa.o si3217x_intf.o si3217x_revb_intf.o si3217x_revc_intf.o si3219x_intf.o si3226x_intf.o si3228x_intf.o
+
+obj-$(CONFIG_SND_SOC_SI3218X) += snd-soc-proslic-common.o
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/src/proslic.c b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/src/proslic.c
new file mode 100644
index 0000000..7a75cc8
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/src/proslic.c
@@ -0,0 +1,4651 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Distributed by:
+ * Silicon Laboratories, Inc
+ *
+ * This file contains proprietary information.
+ * No dissemination allowed without prior written permission from
+ * Silicon Laboratories, Inc.
+ *
+ * File Description:
+ * This is the generic interface file for the ProSLIC drivers.
+ *
+ * Customers should be calling this level for ProSLIC specific
+ * functions (vs. chipset specific versions of the code)
+ *
+ */
+
+#include "../config_inc/si_voice_datatypes.h"
+#include "../inc/si_voice_ctrl.h"
+#include "../inc/si_voice_timer_intf.h"
+#include "../inc/proslic.h"
+#include "../config_inc/proslic_api_config.h"
+
+#ifdef ENABLE_DEBUG
+#define LOGPRINT_PREFIX "ProSLIC:"
+#endif
+
+#ifdef SI3217X
+#include "si3217x.h"
+#include "si3217x_intf.h"
+extern Si3217x_General_Cfg Si3217x_General_Configuration;
+#ifndef DISABLE_FSK_SETUP
+extern ProSLIC_FSK_Cfg Si3217x_FSK_Presets[];
+#endif
+#ifndef DISABLE_TONE_SETUP
+extern ProSLIC_Tone_Cfg Si3217x_Tone_Presets[];
+#endif
+
+#endif /* 17X */
+
+#ifdef SI3218X
+#include "../inc/si3218x.h"
+#include "../inc/si3218x_intf.h"
+extern Si3218x_General_Cfg Si3218x_General_Configuration;
+#ifndef DISABLE_FSK_SETUP
+extern ProSLIC_FSK_Cfg Si3218x_FSK_Presets[];
+#endif
+#ifndef DISABLE_TONE_SETUP
+extern ProSLIC_Tone_Cfg Si3218x_Tone_Presets[];
+#endif
+#endif /* 18X */ 
+
+#ifdef SI3219X
+#include "si3219x.h"
+#include "si3219x_intf.h"
+extern Si3219x_General_Cfg Si3219x_General_Configuration;
+#ifndef DISABLE_FSK_SETUP
+extern ProSLIC_FSK_Cfg Si3219x_FSK_Presets[];
+#endif
+#ifndef DISABLE_TONE_SETUP
+extern ProSLIC_Tone_Cfg Si3219x_Tone_Presets[];
+#endif
+#endif /* 19X */
+
+#ifdef SI3226X
+#include "si3226x.h"
+#include "si3226x_intf.h"
+extern Si3226x_General_Cfg Si3226x_General_Configuration;
+#ifndef DISABLE_FSK_SETUP
+extern ProSLIC_FSK_Cfg Si3226x_FSK_Presets[];
+#endif
+#ifndef DISABLE_TONE_SETUP
+extern ProSLIC_Tone_Cfg Si3226x_Tone_Presets[];
+#endif
+#endif /* 26X */
+
+#ifdef SI3228X
+#include "si3228x.h"
+#include "si3228x_intf.h"
+extern Si3228x_General_Cfg Si3228x_General_Configuration;
+#ifndef DISABLE_FSK_SETUP
+extern ProSLIC_FSK_Cfg Si3228x_FSK_Presets[];
+#endif
+#ifndef DISABLE_TONE_SETUP
+extern ProSLIC_Tone_Cfg Si3228x_Tone_Presets[];
+#endif
+
+#endif /* 28X */
+
+#define pCtrl(X)                                   (X)->deviceId->ctrlInterface
+#define pProHW(X)                                  pCtrl((X))->hCtrl
+#define WriteRAM(PCHAN, CHANNEL, RAMADDR, RAMDATA) (PCHAN)->deviceId->ctrlInterface->WriteRAM_fptr(pProHW(PCHAN), (CHANNEL), (RAMADDR), (RAMDATA))
+#define ReadRAM(PCHAN, CHANNEL, RAMADDR)           (PCHAN)->deviceId->ctrlInterface->ReadRAM_fptr(pProHW(PCHAN), (CHANNEL), (RAMADDR))
+#define SetSemaphore(X)                            (X)->deviceId->ctrlInterface->Semaphore_fptr
+#define ReadReg(PCHAN, CHANNEL, REGADDR)           (PCHAN)->deviceId->ctrlInterface->ReadRegister_fptr(pProHW(PCHAN), (CHANNEL), (REGADDR))
+#define WriteReg(PCHAN, CHANNEL, REGADDR, REGDATA) (PCHAN)->deviceId->ctrlInterface->WriteRegister_fptr(pProHW(PCHAN), (CHANNEL), (REGADDR), (REGDATA))
+
+/*
+** Timers
+*/
+#define TimeElapsed   pProslic->deviceId->ctrlInterface->timeElapsed_fptr
+#define getTime       pProslic->deviceId->ctrlInterface->getTime_fptr
+#define pProTimer	    pProslic->deviceId->ctrlInterface->hTimer
+#define Delay         pProslic->deviceId->ctrlInterface->Delay_fptr
+#define pProTimerX(X)	((X)->deviceId->ctrlInterface->hTimer)
+#define DelayX(X,Y)   ((X)->deviceId->ctrlInterface->Delay_fptr(pProTimerX(X),Y))
+
+#define PROSLIC_TIMEOUT_DCDC_DOWN 200 /* Number of 10 mSec ticks */
+
+/*****************************************************************************************************/
+int32 ProSLIC_ReadMADCScaled(proslicChanType_ptr hProslic,uInt16 addr,
+                             int32 scale)
+{
+  TRACEPRINT(hProslic,"addr: %u scale: %ld\n", addr, scale);
+#ifdef SI3217X
+  if (hProslic->deviceId->chipType >= SI32171
+      && hProslic->deviceId->chipType <= SI32179)
+  {
+    return Si3217x_ReadMADCScaled(hProslic,addr,scale);
+  }
+#endif
+
+#ifdef SI3218X
+  if (hProslic->deviceId->chipType >= SI32180
+      && hProslic->deviceId->chipType <= SI32189)
+  {
+    return Si3218x_ReadMADCScaled(hProslic,addr,scale);
+  }
+#endif
+
+#ifdef SI3219X
+  if ( IS_SI3219X(hProslic->deviceId) )
+  {
+    return Si3219x_ReadMADCScaled(hProslic,addr,scale);
+  }
+#endif
+
+#ifdef SI3226X
+  if (hProslic->deviceId->chipType >= SI32260
+      && hProslic->deviceId->chipType <= SI32269)
+  {
+    return Si3226x_ReadMADCScaled(hProslic,addr,scale);
+  }
+#endif
+
+#ifdef SI3228X
+  if (hProslic->deviceId->chipType >= SI32280
+      && hProslic->deviceId->chipType <= SI32289)
+  {
+    return Si3228x_ReadMADCScaled(hProslic,addr,scale);
+  }
+#endif
+
+  return -1;
+}
+
+/*****************************************************************************************************/
+ramData ProSLIC_ReadRAM(proslicChanType_ptr hProslic,uInt16 addr)
+{
+  TRACEPRINT(hProslic, "addr: %u\n", addr);
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+  return (ReadRAM(hProslic, hProslic->channel, addr));
+}
+
+/*****************************************************************************************************/
+int ProSLIC_WriteRAM(proslicChanType_ptr hProslic,uInt16 addr, ramData data)
+{
+  TRACEPRINT(hProslic, "addr: %u data: 0x%04X\n", addr, data);
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+  return (WriteRAM(hProslic, hProslic->channel, addr,data));
+}
+
+/*****************************************************************************************************/
+int ProSLIC_PrintDebugData(proslicChanType_ptr hProslic)
+{
+  TRACEPRINT(hProslic, "\n", NULL);
+#ifdef ENABLE_DEBUG
+  ProSLIC_PrintDebugReg(hProslic);
+  return ProSLIC_PrintDebugRAM(hProslic);
+#else
+  SILABS_UNREFERENCED_PARAMETER(hProslic);
+  return RC_NONE;
+#endif
+}
+
+/*****************************************************************************************************/
+int ProSLIC_PrintDebugReg(proslicChanType_ptr hProslic)
+{
+#ifdef ENABLE_DEBUG
+  uInt8 regAddr;
+  TRACEPRINT(hProslic, "\n", NULL);
+
+  /*
+     NOTE: Not all ProSLICs have defined values after location 99
+     (and have 1 location after that), but for simplicity, we print them anyway...
+  */
+  for(regAddr = 0; regAddr < 127; regAddr++)
+  {
+    LOGPRINT("%sRegister %03u = 0x%02X\n", LOGPRINT_PREFIX, regAddr,
+             ReadReg(hProslic, hProslic->channel, regAddr));
+  }
+#else
+  SILABS_UNREFERENCED_PARAMETER(hProslic);
+#endif
+
+  return RC_NONE;
+}
+
+/*****************************************************************************************************/
+/* NOTE: locations above 1024 are protected, the API disables protection during initialization, but if this
+   function is called prior to initialization, then UAM is not set and will impact the ReadRAM call...
+   Upper limit is based upon chipset type...
+*/
+int ProSLIC_PrintDebugRAM(proslicChanType_ptr hProslic)
+{
+#ifdef ENABLE_DEBUG
+  uInt16 ramAddr;
+  uInt16 maxAddr= 0;
+  TRACEPRINT(hProslic, "\n",NULL);
+
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+#ifdef SI3217X
+  if (hProslic->deviceId->chipType >= SI32171
+      && hProslic->deviceId->chipType <= SI32179)
+  {
+    maxAddr = 1596;
+  }
+#endif
+
+#ifdef SI3218X
+  if (hProslic->deviceId->chipType >= SI32180
+      && hProslic->deviceId->chipType <= SI32189)
+  {
+    maxAddr = 1644;
+  }
+#endif
+
+#ifdef SI3219X
+  if ( IS_SI3219X(hProslic->deviceId) )
+  {
+    maxAddr = 1644;
+  }
+#endif
+
+#ifdef SI3226X
+  if (hProslic->deviceId->chipType >= SI32260
+      && hProslic->deviceId->chipType <= SI32269)
+  {
+    maxAddr = 1646;
+  }
+#endif
+
+#ifdef SI3228X
+  if (hProslic->deviceId->chipType >= SI32280
+      && hProslic->deviceId->chipType <= SI32289)
+  {
+    maxAddr = 1646;
+  }
+#endif
+
+  for(ramAddr = 0; ramAddr < maxAddr; ramAddr++)
+  {
+    LOGPRINT("%sRAM %04u = 0x%08X\n", LOGPRINT_PREFIX, ramAddr,
+             (unsigned int)(ReadRAM(hProslic, hProslic->channel, ramAddr)));
+  }
+#else
+  SILABS_UNREFERENCED_PARAMETER(hProslic);
+#endif /* ENABLE_DEBUG */
+  return RC_NONE;
+}
+
+/*****************************************************************************************************/
+/*
+** Function: isVerifiedProslic
+**
+** Description:
+** Determine if DAA or ProSLIC present
+**
+** Input Parameters:
+** pProslic: pointer to PROSLIC channel object
+**
+** Return:
+** channelType
+*/
+int ProSLIC_identifyChannelType(proslicChanType *pProslic)
+{
+  uInt8 data;
+  TRACEPRINT(pProslic, "\n",NULL);
+  /*
+  **  Register 13 (DAA) always has bits 0:1 set to 0 and bit 6 set to 1
+  **  Register 13 (PROSLIC) can have bits 0:1, and 4 set, while all others are undefined
+  **  Write 0x13 to Reg 13. The following return values are expected -
+  **
+  **   0x00 or 0xFF    :    No device present
+  **   0x4X            :    DAA
+  **   0x13            :    PROSLIC
+  */
+
+  WriteReg(pProslic,pProslic->channel,PROSLIC_REG_PCMTXHI,0x13);
+  Delay(pProTimer,5);
+
+  /* Now check if the value took */
+  data = ReadReg(pProslic,pProslic->channel,PROSLIC_REG_PCMTXHI);
+
+  if( data == 0x13)
+  {
+    return PROSLIC;
+  }
+  else if (data == 0x40)
+  {
+    return DAA;
+  }
+  else
+  {
+    return UNKNOWN;
+  }
+}
+
+/*****************************************************************************************************/
+int ProSLIC_VerifyControlInterface(proslicChanType_ptr hProslic)
+{
+  TRACEPRINT(hProslic, "\n",NULL);
+  if (ProSLIC_identifyChannelType(hProslic) != PROSLIC)
+  {
+    return RC_CHANNEL_TYPE_ERR;
+  }
+
+  /* Note: ProSLIC_identifyChannelType() did a register w/r test earlier */
+
+  /* Verify RAM rd/wr with innocuous RAM location */
+  WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_VERIFY_IO,0x12345678L);
+  if (ReadRAM(hProslic,hProslic->channel, PROSLIC_RAM_VERIFY_IO) != 0x12345678L)
+  {
+    hProslic->error = RC_SPI_FAIL;
+    DEBUG_PRINT(hProslic, "%sProslic %d RAM not communicating. RAM access fail.\n",
+                LOGPRINT_PREFIX, hProslic->channel);
+    return RC_SPI_FAIL;
+  }
+  return RC_NONE;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_VerifyMasterStat(proslicChanType_ptr pProslic)
+{
+  uInt8 regData;
+
+  TRACEPRINT(pProslic, "\n", NULL);
+  WriteReg(pProslic,pProslic->channel, PROSLIC_REG_MSTRSTAT,
+           0xFF); /* Clear Master status */
+  regData = ReadReg(pProslic, pProslic->channel, PROSLIC_REG_MSTRSTAT);
+
+  if( regData != 0x1F )
+  {
+    return RC_SPI_FAIL;
+  }
+  else
+  {
+    return RC_NONE;
+  }
+}
+
+/*****************************************************************************************************/
+#ifdef SIVOICE_MULTI_BOM_SUPPORT
+int ProSLIC_Init_MultiBOM (proslicChanType_ptr *hProslic,int size, int preset)
+{
+  TRACEPRINT(*hProslic, "size: %d preset: %d\n", size, preset);
+#ifdef SI3217X
+  if ((*hProslic)->deviceId->chipType >= SI32171
+      && (*hProslic)->deviceId->chipType <= SI32179)
+  {
+    return Si3217x_Init_MultiBOM(hProslic,size,preset);
+  }
+#endif
+
+#ifdef SI3218X
+  if ((*hProslic)->deviceId->chipType >= SI32180
+      && (*hProslic)->deviceId->chipType <= SI32189)
+  {
+    return Si3218x_Init_MultiBOM(hProslic,size,preset);
+  }
+#endif
+
+#ifdef SI3219X
+  if ( IS_SI3219X((*hProslic)->deviceId) )
+  {
+    return Si3219x_Init_MultiBOM(hProslic,size,preset);
+  }
+#endif
+
+#ifdef SI3226X
+  if ((*hProslic)->deviceId->chipType >= SI32260
+      && (*hProslic)->deviceId->chipType <= SI32269)
+  {
+    return Si3226x_Init_MultiBOM(hProslic,size,preset);
+  }
+#endif
+
+#ifdef SI3228X
+  if ((*hProslic)->deviceId->chipType >= SI32280
+      && (*hProslic)->deviceId->chipType <= SI32289)
+  {
+    return Si3228x_Init_MultiBOM(hProslic,size,preset);
+  }
+#endif
+
+  return RC_COMPLETE_NO_ERR;
+}
+#endif
+
+/*****************************************************************************************************/
+int ProSLIC_Init (proslicChanType_ptr *hProslic,int size)
+{
+  TRACEPRINT(*hProslic, "size: %d\n", size);
+  return ProSLIC_Init_with_Options(hProslic, size, INIT_NO_OPT);
+}
+
+/*****************************************************************************************************/
+int ProSLIC_Reinit (proslicChanType_ptr *hProslic,int size)
+{
+  TRACEPRINT(*hProslic, "size: %d\n", size);
+  return ProSLIC_Init_with_Options(hProslic, size, INIT_REINIT);
+}
+
+/*****************************************************************************************************/
+int ProSLIC_Init_with_Options (proslicChanType_ptr *hProslic,int size,
+                               int option)
+{
+  TRACEPRINT(*hProslic, "size: %d option: %d\n", size, option);
+#ifdef SI3226X
+  if ((*hProslic)->deviceId->chipType >= SI32260
+      && (*hProslic)->deviceId->chipType <= SI32269)
+  {
+    return Si3226x_Init_with_Options(hProslic,size, option);
+  }
+#endif
+
+#ifdef SI3228X
+  if ((*hProslic)->deviceId->chipType >= SI32280
+      && (*hProslic)->deviceId->chipType <= SI32289)
+  {
+    return Si3228x_Init_with_Options(hProslic,size, option);
+  }
+#endif
+
+#ifdef SI3217X
+  if ((*hProslic)->deviceId->chipType >= SI32171
+      && (*hProslic)->deviceId->chipType <= SI32179)
+  {
+    return Si3217x_Init_with_Options(hProslic,size, option);
+  }
+#endif
+
+#ifdef SI3218X
+  if ((*hProslic)->deviceId->chipType >= SI32180
+      && (*hProslic)->deviceId->chipType <= SI32189)
+  {
+    return Si3218x_Init_with_Options(hProslic,size, option);
+  }
+#endif
+
+#ifdef SI3219X
+  if ( IS_SI3219X((*hProslic)->deviceId) )
+  {
+    return Si3219x_Init_with_Options(hProslic,size, option);
+  }
+#endif
+
+  return RC_IGNORE;
+}
+
+/*****************************************************************************************************/
+#if defined(SI3217X) || defined(SI3218X) || defined SI3226X || defined SI3228X || defined(SI3219X)
+/* Check patch data - returns TRUE if no error.*/
+static BOOLEAN ProSLIC_VerifyPatchData(proslicChanType *pProslic,
+                                       const ramData *data, uInt16 maxCount )
+{
+  int loop;
+  ramData read_data;
+  TRACEPRINT(pProslic, "dataptr: %p, count: %d\n", data, maxCount);
+
+  for(loop = 0; loop < maxCount; loop++)
+  {
+    if(*data)
+    {
+      read_data = ReadRAM(pProslic, pProslic->channel, PROSLIC_RAM_PRAM_DATA);
+      if( ((*data) << 9) != read_data)
+      {
+        return FALSE;
+      }
+    }
+    else
+    {
+      break;
+    }
+    data++;
+  }
+  return TRUE;
+}
+
+/* Check if the jump table is written correctly.. */
+static BOOLEAN ProSLIC_VerifyPatchJMPLow(proslicChanType *pProslic,
+    const uInt16 *data)
+{
+  uInt8 address = PATCH_JMPTBL_START_ADDR;
+  int regData;
+
+  TRACEPRINT(pProslic, "dataptr: %p\n", data);
+  for(address = PATCH_JMPTBL_START_ADDR;
+      address < (PATCH_JMPTBL_START_ADDR+(2*PATCH_NUM_LOW_ENTRIES)); address++)
+  {
+    if(*data)
+    {
+      regData = ReadReg(pProslic, pProslic->channel, address);
+      if(regData != ((*data) & 0xFF))
+      {
+        return FALSE;
+      }
+
+      address++;
+
+      regData = ReadReg(pProslic, pProslic->channel, address);
+      if(regData != (((*data)>>8) & 0xFF))
+      {
+        return FALSE;
+      }
+
+      data++;
+    }
+    else
+    {
+      break;
+    }
+  }
+  return TRUE;
+}
+
+#if defined SI3226X || defined SI3228X || defined SI3218X || defined SI3219X
+/* For chipsets supporting more than 8 jump entries, verify them */
+static BOOLEAN ProSLIC_VerifyPatchJMPHigh(proslicChanType *pProslic,
+    const uInt16 *data)
+{
+  uInt16 address = PATCH_JMPTBL_HIGH_ADDR;
+  ramData read_data;
+
+  TRACEPRINT(pProslic, "dataptr: %p\n", data);
+  for(address = PATCH_JMPTBL_HIGH_ADDR;
+      address < (PATCH_JMPTBL_HIGH_ADDR+PATCH_NUM_HIGH_ENTRIES); address++)
+  {
+    read_data = (ReadRAM(pProslic, pProslic->channel, address) & 0x1FFFL);
+    if(*data != read_data)
+    {
+      return FALSE;
+
+    }
+    data++;
+  }
+  return TRUE;
+}
+#endif /* SI3226X, SI3228X, SI3218X, SI3219X */
+
+static BOOLEAN ProSLIC_VerifyPatchSupportRAM(proslicChanType *pProslic, 
+                                           const uInt16 *ramAddr, const ramData *ramData)
+{
+  int i;
+
+  for(i = 0; ramAddr[i]; i++)
+  {
+    if( ReadRAM(pProslic, pProslic->channel, ramAddr[i]) != ramData[i])
+    {
+      return FALSE;
+    }
+  } 
+
+  return TRUE;
+}
+
+/* Load the first 8 jump table entries */
+static void ProSLIC_LoadPatchJMPLow(proslicChanType *pProslic, uInt8 channel,
+                                    const uInt16 *data)
+{
+  uInt8 address;
+
+  TRACEPRINT(pProslic, "chan: %d dataptr: %p\n", channel, data);
+
+  for(address = PATCH_JMPTBL_START_ADDR;
+      address < (PATCH_JMPTBL_START_ADDR+(2*PATCH_NUM_LOW_ENTRIES)); address++)
+  {
+    WriteReg(pProslic, channel, address,((*data) & 0xFF));
+    address++;
+    WriteReg(pProslic, channel, address,(((*data)>>8) & 0xFF));
+    data++;
+  }
+}
+
+/* Load Patch data */
+static void ProSLIC_LoadPatchData(proslicChanType *pProslic, uInt8 channel,
+                                  const ramData *data)
+{
+  int loop;
+
+  TRACEPRINT(pProslic, "chan: %d dataptr: %p\n", channel, data);
+  WriteRAM(pProslic, channel, PROSLIC_RAM_PRAM_ADDR, 0);
+
+  for(loop = 0; loop < PATCH_MAX_SIZE; loop++)
+  {
+    if(*data)
+    {
+      /* Can we take advantage of auto increment, if not, set the address */
+      if( (pProslic->deviceId->chipRev < 3)
+          && (channel == PROSLIC_CHAN_BROADCAST))
+      {
+        WriteRAM(pProslic, channel, PROSLIC_RAM_PRAM_ADDR, loop << 19);
+      }
+
+      WriteRAM(pProslic, channel, PROSLIC_RAM_PRAM_DATA, (*data) << 9);
+    }
+    else
+    {
+      return;
+    }
+    data++;
+  }
+}
+
+/* Load Support RAM - basically RAM address/data pairs to be written as part of the Patch process - do not call directly */
+void ProSLIC_LoadSupportRAM(proslicChanType *pProslic, uInt8 channel,
+                                   const uInt16 *address, const ramData *data)
+{
+  TRACEPRINT(pProslic, "chan: %d addressptr: %p dataptr: %p\n", channel, address,
+             data);
+  while( *address )
+  {
+    WriteRAM(pProslic, channel, *address, *data);
+    address++;
+    data++;
+  }
+}
+
+#if defined SI3226X || defined SI3228X || defined SI3218X || defined SI3219X
+/* Load Jump table high for chipsets supporting more than 8 jump entries */
+static void ProSLIC_LoadJMPHigh(proslicChanType *pProslic, uInt8 channel,
+                                const uInt16 *data)
+{
+  uInt16 loop;
+  TRACEPRINT(pProslic, "chan: %d dataptr: %p\n", channel, data);
+  for(loop = PATCH_JMPTBL_HIGH_ADDR;
+      loop < (PATCH_JMPTBL_HIGH_ADDR+PATCH_NUM_HIGH_ENTRIES); loop++)
+  {
+    WriteRAM(pProslic, channel, loop, ((*data) & 0x1FFFL) );
+    data++;
+  }
+}
+#endif /* SI3226X, SI3228X, SI3218X, SI3219X */
+
+/* Code assumes ProSLIC_LoadPatch has verified chip type. This is NOT meant to be called
+ * by the user directly.
+ */
+BOOLEAN ProSLIC_LoadPatch_extended(proslicChanType *pProslic,
+                                   const proslicPatch *pPatch, 
+                                   BOOLEAN is_broadcast, BOOLEAN is_second_chan)
+{
+  uInt8 channel;
+  const uInt16 jmp_disable[PATCH_NUM_LOW_ENTRIES] = {0,0,0,0,0,0,0,0};
+
+#if defined SI3226X || defined SI3228X || defined SI3218X ||defined SI3219X
+  BOOLEAN hasJmpTableHigh = FALSE;
+  const uInt16 jmphigh_disable[PATCH_NUM_HIGH_ENTRIES] = {0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL};
+#endif
+
+  TRACEPRINT(pProslic, "patchptr: %p bcast: %d\n", pPatch, is_broadcast);
+
+  if(pPatch == NULL)
+  {
+    return RC_NONE;
+  }
+
+  if(is_broadcast == TRUE)
+  {
+    channel = PROSLIC_CHAN_BROADCAST;
+  }
+  else
+  {
+    channel = pProslic->channel;
+  }
+
+  ProSLIC_SetUserMode(pProslic,TRUE, is_broadcast);
+
+  /* Disable Patch */
+  WriteReg(pProslic, channel, PROSLIC_REG_JMPEN, 0);
+  if(is_second_chan == FALSE)
+  {
+    DEBUG_PRINT(pProslic, "%sloading patch: %08lx\n", LOGPRINT_PREFIX,
+                 (long unsigned int)pPatch->patchSerial);
+
+    ProSLIC_LoadPatchJMPLow(pProslic, channel, jmp_disable);
+
+#if defined SI3226X || defined SI3228X || defined SI3218X || defined SI3219X
+    if( 0
+#ifdef SI3226X
+        || (pProslic->deviceId->chipType >= SI32260
+            && pProslic->deviceId->chipType <= SI32269)
+#endif
+#ifdef SI3228X
+        || (pProslic->deviceId->chipType >= SI32280
+            && pProslic->deviceId->chipType <= SI32289)
+#endif
+#ifdef SI3218X
+        || (pProslic->deviceId->chipType >= SI32180
+            && pProslic->deviceId->chipType <= SI32189)
+#endif
+#ifdef SI3219X
+        || ( IS_SI3219X(pProslic->deviceId) )
+#endif
+      )
+    {
+      hasJmpTableHigh = TRUE;
+      ProSLIC_LoadJMPHigh(pProslic, channel, jmphigh_disable);
+    }
+#endif
+
+    ProSLIC_LoadPatchData(pProslic, channel, pPatch->patchData);
+
+    WriteReg(pProslic, channel, PROSLIC_REG_RAM_ADDR_HI, 0);
+
+    ProSLIC_LoadPatchJMPLow(pProslic, channel, pPatch->patchEntries);
+
+#if defined SI3226X || defined SI3228X || defined SI3218X || defined SI3219X
+    if(hasJmpTableHigh == TRUE)
+    {
+      ProSLIC_LoadJMPHigh(pProslic, channel,
+                          &(pPatch->patchEntries[PATCH_NUM_LOW_ENTRIES]));
+    }
+#endif
+    WriteRAM(pProslic, channel, PROSLIC_RAM_PATCHID,
+             pPatch->patchSerial); /* write the patch ID */
+  } /* !second channel */
+
+  ProSLIC_LoadSupportRAM(pProslic, channel, pPatch->psRamAddr, pPatch->psRamData);
+
+  return RC_NONE;
+
+}
+
+#endif /* patch helper functions */
+
+int ProSLIC_LoadPatch (proslicChanType_ptr pProslic,const proslicPatch *pPatch)
+{
+  int rc;
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+  if( (rc = ProSLIC_LoadPatch_extended(pProslic, pPatch, FALSE, FALSE) ) == RC_NONE)
+  {
+#ifdef DISABLE_VERIFY_PATCH
+    return WriteReg(pProslic, pProslic->channel, PROSLIC_REG_JMPEN, 1);
+#endif
+  }
+
+  return rc;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_VerifyPatch (proslicChanType_ptr hProslic,const proslicPatch *pPatch)
+{
+  TRACEPRINT(hProslic, "patchptr: %p\n", pPatch);
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+  if(pPatch == NULL)
+  {
+    return RC_NONE;
+  }
+
+  WriteReg(hProslic, hProslic->channel, PROSLIC_REG_JMPEN, 0);
+  WriteRAM(hProslic, hProslic->channel, PROSLIC_RAM_PRAM_ADDR, 0);
+
+  if(ProSLIC_VerifyPatchData(hProslic, pPatch->patchData,
+                             PATCH_MAX_SIZE) == FALSE)
+  {
+    DEBUG_PRINT(hProslic, "%sPatch data corrupted: channel %d\n",LOGPRINT_PREFIX,
+                hProslic->channel);
+    WriteRAM(hProslic, hProslic->channel, PROSLIC_RAM_PATCHID,
+             0UL); /* Mark patch as invalid */
+    return RC_PATCH_RAM_VERIFY_FAIL;
+  }
+
+  /*zero out RAM_ADDR_HI*/
+  WriteReg (hProslic, hProslic->channel, PROSLIC_REG_RAM_ADDR_HI,0);
+
+  if( ProSLIC_VerifyPatchJMPLow(hProslic, pPatch->patchEntries) == FALSE)
+  {
+    DEBUG_PRINT(hProslic,"%sPatch jumptable corrupted: channel %d\n",
+                LOGPRINT_PREFIX,hProslic->channel);
+    WriteRAM(hProslic, hProslic->channel, PROSLIC_RAM_PATCHID,
+             0UL); /* Mark patch as invalid */
+    return RC_PATCH_RAM_VERIFY_FAIL;
+  }
+
+#if defined SI3226X || defined SI3228X || defined SI3218X || defined SI3219X
+  if( 0
+#ifdef SI3226X
+      || (hProslic->deviceId->chipType >= SI32260
+          && hProslic->deviceId->chipType <= SI32269)
+#endif
+#ifdef SI3228X
+      || (hProslic->deviceId->chipType >= SI32280
+          && hProslic->deviceId->chipType <= SI32289)
+#endif
+#ifdef SI3218X
+      || (hProslic->deviceId->chipType >= SI32180
+          && hProslic->deviceId->chipType <= SI32189)
+#endif
+#ifdef SI3219X
+      || ( IS_SI3219X(hProslic->deviceId) )
+#endif
+    )
+
+  {
+    if( ProSLIC_VerifyPatchJMPHigh(hProslic,
+                                   &(pPatch->patchEntries[PATCH_NUM_LOW_ENTRIES])) == FALSE)
+    {
+      DEBUG_PRINT(hProslic,"%sPatch jumptable high corrupted: channel %d\n",
+                  LOGPRINT_PREFIX,hProslic->channel);
+      WriteRAM(hProslic, hProslic->channel, PROSLIC_RAM_PATCHID,
+               0UL); /* Mark patch as invalid */
+      return RC_PATCH_ENTRY_VERIFY_FAIL;
+    }
+  }
+
+#endif
+
+  if( ProSLIC_VerifyPatchSupportRAM( hProslic, pPatch->psRamAddr, pPatch->psRamData) == FALSE)
+  {
+      DEBUG_PRINT(hProslic,"%sPatch init data corrupted: channel %d\n",
+                  LOGPRINT_PREFIX,hProslic->channel);
+      WriteRAM(hProslic, hProslic->channel, PROSLIC_RAM_PATCHID,
+               0UL); /* Mark patch as invalid */
+      return RC_PATCH_ENTRY_VERIFY_FAIL;
+  }
+
+  WriteReg (hProslic, hProslic->channel, PROSLIC_REG_JMPEN,
+            1); /*enable the patch*/
+
+  return RC_NONE;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_SetMuteStatus (proslicChanType_ptr pProslic,
+                           ProslicMuteModes muteEn)
+{
+
+  uInt8 regTemp;
+  uInt8 newRegValue;
+  TRACEPRINT(pProslic, "muteEn: %d\n", muteEn);
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+  regTemp = ReadReg (pProslic,pProslic->channel,PROSLIC_REG_DIGCON);
+
+  WriteReg (pProslic,pProslic->channel,PROSLIC_REG_DIGCON,regTemp&~(0x3));
+  newRegValue = regTemp &~(0x3);
+
+  if (muteEn & PROSLIC_MUTE_RX)
+  {
+    newRegValue |= 1;
+  }
+
+  if (muteEn & PROSLIC_MUTE_TX)
+  {
+    newRegValue |= 2;
+  }
+
+  if(newRegValue != regTemp)
+  {
+    return WriteReg (pProslic,pProslic->channel,PROSLIC_REG_DIGCON,newRegValue);
+  }
+
+  return RC_COMPLETE_NO_ERR;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_SetLoopbackMode (proslicChanType_ptr pProslic,
+                             ProslicLoopbackModes newMode)
+{
+  uInt8 regTemp, newValue;
+  TRACEPRINT(pProslic, "mode: %d\n", newMode);
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+  newValue = regTemp = ReadReg (pProslic,pProslic->channel,PROSLIC_REG_LOOPBACK);
+
+  switch (newMode)
+  {
+    case PROSLIC_LOOPBACK_NONE:
+      newValue &= ~(0x11);
+      break;
+
+    case PROSLIC_LOOPBACK_DIG:
+      newValue |= 1;
+      break;
+
+    case PROSLIC_LOOPBACK_ANA:
+      newValue |= 0x10;
+      break;
+  }
+
+  if(newValue != regTemp)
+  {
+    return WriteReg (pProslic,pProslic->channel,PROSLIC_REG_LOOPBACK, newValue);
+  }
+  return RC_COMPLETE_NO_ERR;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_EnableInterrupts (proslicChanType_ptr hProslic)
+{
+  TRACEPRINT(hProslic, "\n", NULL);
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+#ifdef SI3217X
+  if (hProslic->deviceId->chipType >= SI32171
+      && hProslic->deviceId->chipType <= SI32179)
+  {
+    return Si3217x_EnableInterrupts(hProslic);
+  }
+#endif
+
+#ifdef SI3218X
+  if (hProslic->deviceId->chipType >= SI32180
+      && hProslic->deviceId->chipType <= SI32189)
+  {
+    return Si3218x_EnableInterrupts(hProslic);
+  }
+#endif
+
+#ifdef SI3219X
+  if ( IS_SI3219X(hProslic->deviceId) )
+  {
+    return Si3219x_EnableInterrupts(hProslic);
+  }
+#endif
+
+#ifdef SI3226X
+  if (hProslic->deviceId->chipType >= SI32260
+      && hProslic->deviceId->chipType <= SI32269)
+  {
+    return Si3226x_EnableInterrupts(hProslic);
+  }
+#endif
+
+#ifdef SI3228X
+  if (hProslic->deviceId->chipType >= SI32280
+      && hProslic->deviceId->chipType <= SI32289)
+  {
+    return Si3228x_EnableInterrupts(hProslic);
+  }
+#endif
+
+  return RC_COMPLETE_NO_ERR;
+}
+
+
+/*****************************************************************************************************/
+int ProSLIC_DisableInterrupts (proslicChanType_ptr hProslic)
+{
+#ifdef GCI_MODE
+  uInt8 data;
+#endif
+  uInt8 i;
+  TRACEPRINT(hProslic, "\n", NULL);
+
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+  for(i = PROSLIC_REG_IRQEN1; i < PROSLIC_REG_IRQEN4; i++)
+  {
+    /* Disable the interrupts */
+    WriteReg(hProslic, hProslic->channel, i, 0);
+  }
+
+  /* Clear the pending interrupts */
+  for(i = PROSLIC_REG_IRQ1; i < PROSLIC_REG_IRQ4; i++)
+  {
+#ifdef GCI_MODE
+    data = ReadReg(hProslic, hProslic->channel, i);
+    WriteReg( hProslic, hProslic->channel, i, data);
+#else
+    (void)ReadReg(hProslic, hProslic->channel, i);
+#endif
+  }
+  return RC_NONE;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_RingSetup (proslicChanType_ptr hProslic,int preset)
+{
+  TRACEPRINT(hProslic, "preset: %d\n", preset);
+#ifndef DISABLE_RING_SETUP
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+#ifdef SI3217X
+  if (hProslic->deviceId->chipType >= SI32171
+      && hProslic->deviceId->chipType <= SI32179)
+  {
+    return Si3217x_RingSetup(hProslic,preset);
+  }
+#endif
+
+#ifdef SI3218X
+  if (hProslic->deviceId->chipType >= SI32180
+      && hProslic->deviceId->chipType <= SI32189)
+  {
+    return Si3218x_RingSetup(hProslic,preset);
+  }
+#endif
+
+#ifdef SI3219X
+  if ( IS_SI3219X(hProslic->deviceId) )
+  {
+    return Si3219x_RingSetup(hProslic,preset);
+  }
+#endif
+
+#ifdef SI3226X
+  if (hProslic->deviceId->chipType >= SI32260
+      && hProslic->deviceId->chipType <= SI32269)
+  {
+    return Si3226x_RingSetup(hProslic,preset);
+  }
+#endif
+#ifdef SI3228X
+  if (hProslic->deviceId->chipType >= SI32280
+      && hProslic->deviceId->chipType <= SI32289)
+  {
+    return Si3228x_RingSetup(hProslic,preset);
+  }
+#endif
+#else
+  SILABS_UNREFERENCED_PARAMETER(hProslic);
+  SILABS_UNREFERENCED_PARAMETER(preset);
+#endif /*DISABLE_RING_SETUP*/
+  return RC_COMPLETE_NO_ERR;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_ToneGenSetup (proslicChanType_ptr hProslic,int preset)
+{
+  TRACEPRINT(hProslic, "preset: %d\n", preset);
+#ifndef DISABLE_TONE_SETUP
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+#ifdef SI3217X
+  if (hProslic->deviceId->chipType >= SI32171
+      && hProslic->deviceId->chipType <= SI32179)
+  {
+    return ProSLIC_ToneGenSetupPtr(hProslic,&(Si3217x_Tone_Presets[preset]));
+  }
+#endif
+
+#ifdef SI3218X
+  if (hProslic->deviceId->chipType >= SI32180
+      && hProslic->deviceId->chipType <= SI32189)
+  {
+    return ProSLIC_ToneGenSetupPtr(hProslic, &(Si3218x_Tone_Presets[preset]));
+  }
+#endif
+
+#ifdef SI3219X
+  if ( IS_SI3219X(hProslic->deviceId) )
+  {
+    return ProSLIC_ToneGenSetupPtr(hProslic, &(Si3219x_Tone_Presets[preset]));
+  }
+#endif
+
+#ifdef SI3226X
+  if (hProslic->deviceId->chipType >= SI32260
+      && hProslic->deviceId->chipType <= SI32269)
+  {
+    return ProSLIC_ToneGenSetupPtr(hProslic, &(Si3226x_Tone_Presets[preset]));
+  }
+#endif
+#ifdef SI3228X
+  if (hProslic->deviceId->chipType >= SI32280
+      && hProslic->deviceId->chipType <= SI32289)
+  {
+    return ProSLIC_ToneGenSetupPtr(hProslic, &(Si3228x_Tone_Presets[preset]));
+  }
+#endif
+#else
+  SILABS_UNREFERENCED_PARAMETER(hProslic);
+  SILABS_UNREFERENCED_PARAMETER(preset);
+#endif /*DISABLE_TONE_SETUP*/
+  return RC_COMPLETE_NO_ERR;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_FSKSetup (proslicChanType_ptr hProslic,int preset)
+{
+  TRACEPRINT(hProslic, "preset: %d\n", preset);
+#ifndef DISABLE_FSK_SETUP
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+#ifdef SI3217X
+  if (hProslic->deviceId->chipType >= SI32171
+      && hProslic->deviceId->chipType <= SI32179)
+  {
+    return ProSLIC_FSKSetupPtr(hProslic, &Si3217x_FSK_Presets[preset]);
+  }
+#endif
+
+#ifdef SI3218X
+  if (hProslic->deviceId->chipType >= SI32180
+      && hProslic->deviceId->chipType <= SI32189)
+  {
+    return ProSLIC_FSKSetupPtr(hProslic, &Si3218x_FSK_Presets[preset]);
+  }
+#endif
+
+#ifdef SI3219X
+  if ( IS_SI3219X(hProslic->deviceId) )
+  {
+    return ProSLIC_FSKSetupPtr(hProslic, &Si3219x_FSK_Presets[preset]);
+  }
+#endif
+
+#ifdef SI3226X
+  if (hProslic->deviceId->chipType >= SI32260
+      && hProslic->deviceId->chipType <= SI32269)
+  {
+    return ProSLIC_FSKSetupPtr(hProslic, &Si3226x_FSK_Presets[preset]);
+  }
+#endif
+
+#ifdef SI3228X
+  if (hProslic->deviceId->chipType >= SI32280
+      && hProslic->deviceId->chipType <= SI32289)
+  {
+    return ProSLIC_FSKSetupPtr(hProslic,&Si3228x_FSK_Presets[preset]);
+  }
+#endif
+#else
+  SILABS_UNREFERENCED_PARAMETER(hProslic);
+  SILABS_UNREFERENCED_PARAMETER(preset);
+#endif /*DISABLE_FSK_SETUP*/
+  return RC_COMPLETE_NO_ERR;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_ZsynthSetup (proslicChanType_ptr hProslic,int preset)
+{
+  TRACEPRINT(hProslic, "preset: %d\n", preset);
+#ifndef DISABLE_ZSYNTH_SETUP
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+#ifdef SI3217X
+  if (hProslic->deviceId->chipType >= SI32171
+      && hProslic->deviceId->chipType <= SI32179)
+  {
+    return Si3217x_ZsynthSetup(hProslic,preset);
+  }
+#endif
+
+#ifdef SI3218X
+  if (hProslic->deviceId->chipType >= SI32180
+      && hProslic->deviceId->chipType <= SI32189)
+  {
+    return Si3218x_ZsynthSetup(hProslic,preset);
+  }
+#endif
+
+#ifdef SI3219X
+  if ( IS_SI3219X(hProslic->deviceId) )
+  {
+    return Si3219x_ZsynthSetup(hProslic,preset);
+  }
+#endif
+
+#ifdef SI3226X
+  if (hProslic->deviceId->chipType >= SI32260
+      && hProslic->deviceId->chipType <= SI32269)
+  {
+    return Si3226x_ZsynthSetup(hProslic,preset);
+  }
+#endif
+
+#ifdef SI3228X
+  if (hProslic->deviceId->chipType >= SI32280
+      && hProslic->deviceId->chipType <= SI32289)
+  {
+    return Si3228x_ZsynthSetup(hProslic,preset);
+  }
+#endif
+#else
+  SILABS_UNREFERENCED_PARAMETER(hProslic);
+  SILABS_UNREFERENCED_PARAMETER(preset);
+#endif /*DISABLE_ZSYNTH_SETUP*/
+  return RC_COMPLETE_NO_ERR;
+}
+
+/*****************************************************************************************************/
+#ifndef DISABLE_CI_SETUP
+int ProSLIC_GciCISetup (proslicChanType_ptr hProslic,int preset)
+{
+  TRACEPRINT(hProslic, "preset: %d\n", preset);
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+#ifdef SI3217X
+  if (hProslic->deviceId->chipType >= SI32171
+      && hProslic->deviceId->chipType <= SI32179)
+  {
+    return Si3217x_GciCISetup(hProslic,preset);
+  }
+#endif
+
+#ifdef SI3226X
+  if (hProslic->deviceId->chipType >= SI32260
+      && hProslic->deviceId->chipType <= SI32269)
+  {
+    return Si3226x_GciCISetup(hProslic,preset);
+  }
+#endif
+
+#if !defined(SI3217X) && !defined(SI3226X)
+  SILABS_UNREFERENCED_PARAMETER(hProslic);
+  SILABS_UNREFERENCED_PARAMETER(preset);
+#endif
+
+  return RC_COMPLETE_NO_ERR;
+}
+#endif /*DISABLE_CI_SETUP*/
+
+/*****************************************************************************************************/
+int ProSLIC_TXAudioGainSetup (proslicChanType_ptr hProslic,int preset)
+{
+  TRACEPRINT(hProslic, "preset: %d\n", preset);
+#ifndef DISABLE_AUDIOGAIN_SETUP
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+#ifdef SI3217X
+  if (hProslic->deviceId->chipType >= SI32171
+      && hProslic->deviceId->chipType <= SI32179)
+  {
+    return Si3217x_TXAudioGainSetup(hProslic,preset);
+  }
+#endif
+
+#ifdef SI3218X
+  if (hProslic->deviceId->chipType >= SI32180
+      && hProslic->deviceId->chipType <= SI32189)
+  {
+    return Si3218x_TXAudioGainSetup(hProslic,preset);
+  }
+#endif
+
+#ifdef SI3219X
+  if ( IS_SI3219X(hProslic->deviceId) )
+  {
+    return Si3219x_TXAudioGainSetup(hProslic,preset);
+  }
+#endif
+
+#ifdef SI3226X
+  if (hProslic->deviceId->chipType >= SI32260
+      && hProslic->deviceId->chipType <= SI32269)
+  {
+    return Si3226x_TXAudioGainSetup(hProslic,preset);
+  }
+#endif
+
+#ifdef SI3228X
+  if (hProslic->deviceId->chipType >= SI32280
+      && hProslic->deviceId->chipType <= SI32289)
+  {
+    return Si3228x_TXAudioGainSetup(hProslic,preset);
+  }
+#endif
+#else
+  SILABS_UNREFERENCED_PARAMETER(hProslic);
+  SILABS_UNREFERENCED_PARAMETER(preset);
+
+#endif /*DISABLE_AUDIOGAIN_SETUP*/
+  return RC_COMPLETE_NO_ERR;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_RXAudioGainSetup (proslicChanType_ptr hProslic,int preset)
+{
+  TRACEPRINT(hProslic, "preset: %d\n", preset);
+#ifndef DISABLE_AUDIOGAIN_SETUP
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+#ifdef SI3217X
+  if (hProslic->deviceId->chipType >= SI32171
+      && hProslic->deviceId->chipType <= SI32179)
+  {
+    return Si3217x_RXAudioGainSetup(hProslic,preset);
+  }
+#endif
+
+#ifdef SI3218X
+  if (hProslic->deviceId->chipType >= SI32180
+      && hProslic->deviceId->chipType <= SI32189)
+  {
+    return Si3218x_RXAudioGainSetup(hProslic,preset);
+  }
+#endif
+
+#ifdef SI3219X
+  if ( IS_SI3219X(hProslic->deviceId) )
+  {
+    return Si3219x_RXAudioGainSetup(hProslic,preset);
+  }
+#endif
+
+
+#ifdef SI3226X
+  if (hProslic->deviceId->chipType >= SI32260
+      && hProslic->deviceId->chipType <= SI32269)
+  {
+    return Si3226x_RXAudioGainSetup(hProslic,preset);
+  }
+#endif
+
+#ifdef SI3228X
+  if (hProslic->deviceId->chipType >= SI32280
+      && hProslic->deviceId->chipType <= SI32289)
+  {
+    return Si3228x_RXAudioGainSetup(hProslic,preset);
+  }
+#endif
+
+#else
+  SILABS_UNREFERENCED_PARAMETER(hProslic);
+  SILABS_UNREFERENCED_PARAMETER(preset);
+#endif /*DISABLE_AUDIOGAIN_SETUP*/
+  return RC_COMPLETE_NO_ERR;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_TXAudioGainScale (proslicChanType_ptr hProslic,int preset,
+                              uInt32 pga_scale, uInt32 eq_scale)
+{
+  TRACEPRINT(hProslic, "preset: %d pga_scale: %u eq_scale: %u\n", preset,
+             pga_scale, eq_scale);
+#ifndef DISABLE_AUDIOGAIN_SETUP
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+#ifdef SI3217X
+  if (hProslic->deviceId->chipType >= SI32171
+      && hProslic->deviceId->chipType <= SI32179)
+  {
+    return Si3217x_TXAudioGainScale(hProslic,preset,pga_scale,eq_scale);
+  }
+#endif
+
+#ifdef SI3218X
+  if (hProslic->deviceId->chipType >= SI32180
+      && hProslic->deviceId->chipType <= SI32189)
+  {
+    return Si3218x_TXAudioGainScale(hProslic,preset,pga_scale,eq_scale);
+  }
+#endif
+
+#ifdef SI3219X
+  if ( IS_SI3219X(hProslic->deviceId) )
+  {
+    return Si3219x_TXAudioGainScale(hProslic,preset,pga_scale,eq_scale);
+  }
+#endif
+
+#ifdef SI3226X
+  if (hProslic->deviceId->chipType >= SI32260
+      && hProslic->deviceId->chipType <= SI32269)
+  {
+    return Si3226x_TXAudioGainScale(hProslic,preset,pga_scale,eq_scale);
+  }
+#endif
+
+#ifdef SI3228X
+  if (hProslic->deviceId->chipType >= SI32280
+      && hProslic->deviceId->chipType <= SI32289)
+  {
+    return Si3228x_TXAudioGainScale(hProslic,preset,pga_scale,eq_scale);
+  }
+#endif
+
+#else
+  SILABS_UNREFERENCED_PARAMETER(hProslic);
+  SILABS_UNREFERENCED_PARAMETER(preset);
+#endif /*DISABLE_AUDIOGAIN_SETUP*/
+  return RC_COMPLETE_NO_ERR;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_RXAudioGainScale (proslicChanType_ptr hProslic,int preset,
+                              uInt32 pga_scale, uInt32 eq_scale)
+{
+  TRACEPRINT(hProslic, "preset: %d pga_scale: %u eq_scale: %u\n", preset,
+             pga_scale, eq_scale);
+#ifndef DISABLE_AUDIOGAIN_SETUP
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+#ifdef SI3217X
+  if (hProslic->deviceId->chipType >= SI32171
+      && hProslic->deviceId->chipType <= SI32179)
+  {
+    return Si3217x_RXAudioGainScale(hProslic,preset,pga_scale,eq_scale);
+  }
+#endif
+
+#ifdef SI3218X
+  if (hProslic->deviceId->chipType >= SI32180
+      && hProslic->deviceId->chipType <= SI32189)
+  {
+    return Si3218x_RXAudioGainScale(hProslic,preset,pga_scale,eq_scale);
+  }
+#endif
+
+#ifdef SI3219X
+  if ( IS_SI3219X(hProslic->deviceId) )
+  {
+    return Si3219x_RXAudioGainScale(hProslic,preset,pga_scale,eq_scale);
+  }
+#endif
+
+#ifdef SI3226X
+  if (hProslic->deviceId->chipType >= SI32260
+      && hProslic->deviceId->chipType <= SI32269)
+  {
+    return Si3226x_RXAudioGainScale(hProslic,preset,pga_scale,eq_scale);
+  }
+#endif
+
+#ifdef SI3228X
+  if (hProslic->deviceId->chipType >= SI32280
+      && hProslic->deviceId->chipType <= SI32289)
+  {
+    return Si3228x_RXAudioGainScale(hProslic,preset,pga_scale,eq_scale);
+  }
+#endif
+
+#else
+  SILABS_UNREFERENCED_PARAMETER(hProslic);
+  SILABS_UNREFERENCED_PARAMETER(preset);
+#endif /*DISABLE_AUDIOGAIN_SETUP*/
+  return RC_COMPLETE_NO_ERR;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_AudioGainSetup (proslicChanType_ptr pProslic,int32 rxgain,
+                            int32 txgain,int preset)
+{
+  int rc;
+#ifndef DISABLE_AUDIOGAIN_SETUP
+  int atx_preset = TXACGAIN_SEL;
+  int arx_preset = RXACGAIN_SEL;
+  TRACEPRINT(pProslic, "rxgain: %d txgain: %d preset: %d\n", rxgain, txgain,
+             preset);
+
+  rc = ProSLIC_dbgSetTXGain(pProslic,txgain,preset,atx_preset);
+
+  if( rc  == RC_NONE)
+  {
+    rc = ProSLIC_TXAudioGainSetup(pProslic,TXACGAIN_SEL);
+  }
+
+  if( rc  == RC_NONE)
+  {
+    rc = ProSLIC_dbgSetRXGain(pProslic,rxgain,preset,arx_preset);
+  }
+
+  if( rc  == RC_NONE)
+  {
+    rc = ProSLIC_RXAudioGainSetup(pProslic,RXACGAIN_SEL);
+  }
+  return rc;
+#else
+  SILABS_UNREFERENCED_PARAMETER(pProslic);
+  SILABS_UNREFERENCED_PARAMETER(preset);
+  return RC_IGNORE;
+#endif /*DISABLE_AUDIOGAIN_SETUP*/
+}
+
+/*****************************************************************************************************/
+int ProSLIC_DCFeedSetup (proslicChanType_ptr hProslic,int preset)
+{
+  TRACEPRINT(hProslic, "preset: %d\n", preset);
+#ifndef DISABLE_DCFEED_SETUP
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+#ifdef SI3217X
+  if (hProslic->deviceId->chipType >= SI32171
+      && hProslic->deviceId->chipType <= SI32179)
+  {
+    return Si3217x_DCFeedSetup(hProslic,preset);
+  }
+#endif
+
+#ifdef SI3218X
+  if (hProslic->deviceId->chipType >= SI32180
+      && hProslic->deviceId->chipType <= SI32189)
+  {
+    return Si3218x_DCFeedSetup(hProslic,preset);
+  }
+#endif
+
+#ifdef SI3219X
+  if ( IS_SI3219X(hProslic->deviceId) )
+  {
+    return Si3219x_DCFeedSetupCfg(hProslic, Si3219x_DCfeed_Presets, preset);
+  }
+#endif
+
+#ifdef SI3226X
+  if (hProslic->deviceId->chipType >= SI32260
+      && hProslic->deviceId->chipType <= SI32269)
+  {
+    return Si3226x_DCFeedSetup(hProslic,preset);
+  }
+#endif
+
+#ifdef SI3228X
+  if (hProslic->deviceId->chipType >= SI32280
+      && hProslic->deviceId->chipType <= SI32289)
+  {
+    return Si3228x_DCFeedSetup(hProslic,preset);
+  }
+#endif
+#else
+  SILABS_UNREFERENCED_PARAMETER(hProslic);
+  SILABS_UNREFERENCED_PARAMETER(preset);
+#endif /*DISABLE_DCFEED_SETUP*/
+  return RC_COMPLETE_NO_ERR;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_DCFeedSetupCfg (proslicChanType_ptr hProslic,
+                            ProSLIC_DCfeed_Cfg *cfg, int preset)
+{
+  TRACEPRINT(hProslic, "cfgPtr = %p preset = %d\n", cfg, preset);
+#ifndef DISABLE_DCFEED_SETUP
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+#ifdef SI3217X
+  if (hProslic->deviceId->chipType >= SI32171
+      && hProslic->deviceId->chipType <= SI32179)
+  {
+    return Si3217x_DCFeedSetupCfg(hProslic,cfg,preset);
+  }
+#endif
+
+#ifdef SI3218X
+  if (hProslic->deviceId->chipType >= SI32180
+      && hProslic->deviceId->chipType <= SI32189)
+  {
+    return Si3218x_DCFeedSetupCfg(hProslic,cfg,preset);
+  }
+#endif
+
+#ifdef SI3219X
+  if ( IS_SI3219X(hProslic->deviceId) )
+  {
+    return Si3219x_DCFeedSetupCfg(hProslic,cfg,preset);
+  }
+#endif
+
+#ifdef SI3226X
+  if (hProslic->deviceId->chipType >= SI32260
+      && hProslic->deviceId->chipType <= SI32269)
+  {
+    return Si3226x_DCFeedSetupCfg(hProslic,cfg,preset);
+  }
+#endif
+
+#ifdef SI3228X
+  if (hProslic->deviceId->chipType >= SI32280
+      && hProslic->deviceId->chipType <= SI32289)
+  {
+    return Si3228x_DCFeedSetupCfg(hProslic,cfg,preset);
+  }
+#endif
+
+#else
+  SILABS_UNREFERENCED_PARAMETER(hProslic);
+  SILABS_UNREFERENCED_PARAMETER(preset);
+  SILABS_UNREFERENCED_PARAMETER(cfg);
+#endif /*DISABLE_DCFEED_SETUP*/
+  return RC_COMPLETE_NO_ERR;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_GPIOSetup (proslicChanType_ptr hProslic)
+{
+  TRACEPRINT(hProslic, "\n", NULL);
+#ifndef DISABLE_GPIO_SETUP
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+#ifdef SI3217X
+  if (hProslic->deviceId->chipType >= SI32171
+      && hProslic->deviceId->chipType <= SI32179)
+  {
+    return Si3217x_GPIOSetup(hProslic);
+  }
+#endif
+
+#ifdef SI3226X
+  if (hProslic->deviceId->chipType >= SI32260
+      && hProslic->deviceId->chipType <= SI32269)
+  {
+    return Si3226x_GPIOSetup(hProslic);
+  }
+#endif
+
+#else
+  SILABS_UNREFERENCED_PARAMETER(hProslic);
+#endif /*DISABLE_GPIO_SETUP*/
+  return RC_COMPLETE_NO_ERR;
+}
+
+/*****************************************************************************************************/
+#ifndef DISABLE_PULSEMETERING
+int ProSLIC_PulseMeterSetup (proslicChanType_ptr hProslic,int preset)
+{
+  TRACEPRINT(hProslic, "preset = %d\n", preset);
+#ifndef DISABLE_PULSE_SETUP
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+#ifdef SI3217X
+  if (hProslic->deviceId->chipType >= SI32171
+      && hProslic->deviceId->chipType <= SI32179)
+  {
+    return Si3217x_PulseMeterSetup(hProslic,preset);
+  }
+#endif
+
+#ifdef SI3218X
+  if (hProslic->deviceId->chipType >= SI32180
+      && hProslic->deviceId->chipType <= SI32189)
+  {
+    return Si3218x_PulseMeterSetup(hProslic,preset);
+  }
+#endif
+
+#ifdef SI3219X
+  if ( IS_SI3219X(hProslic->deviceId) )
+  {
+    return Si3219x_PulseMeterSetup(hProslic,preset);
+  }
+#endif
+
+#ifdef SI3226X
+  if (hProslic->deviceId->chipType >= SI32260
+      && hProslic->deviceId->chipType <= SI32269)
+  {
+    return Si3226x_PulseMeterSetup(hProslic,preset);
+  }
+#endif
+
+#ifdef SI3228X
+  if (hProslic->deviceId->chipType >= SI32280
+      && hProslic->deviceId->chipType <= SI32289)
+  {
+    return Si3228x_PulseMeterSetup(hProslic,preset);
+  }
+#endif
+
+#else
+  SILABS_UNREFERENCED_PARAMETER(hProslic);
+  SILABS_UNREFERENCED_PARAMETER(preset);
+#endif /*DISABLE_PULSE_SETUP*/
+  return RC_COMPLETE_NO_ERR;
+}
+#endif
+
+/*****************************************************************************************************/
+int ProSLIC_PCMSetup (proslicChanType_ptr hProslic,int preset)
+{
+  TRACEPRINT(hProslic, "preset = %d\n", preset);
+#ifndef DISABLE_PCM_SETUP
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+#ifdef SI3217X
+  if (hProslic->deviceId->chipType >= SI32171
+      && hProslic->deviceId->chipType <= SI32179)
+  {
+    return Si3217x_PCMSetup(hProslic,preset);
+  }
+#endif
+
+#ifdef SI3218X
+  if (hProslic->deviceId->chipType >= SI32180
+      && hProslic->deviceId->chipType <= SI32189)
+  {
+    return Si3218x_PCMSetup(hProslic,preset);
+  }
+#endif
+
+#ifdef SI3219X
+  if ( IS_SI3219X(hProslic->deviceId) )
+  {
+    return Si3219x_PCMSetup(hProslic,preset);
+  }
+#endif
+
+#ifdef SI3226X
+  if (hProslic->deviceId->chipType >= SI32260
+      && hProslic->deviceId->chipType <= SI32269)
+  {
+    return Si3226x_PCMSetup(hProslic,preset);
+  }
+#endif
+
+#ifdef SI3228X
+  if (hProslic->deviceId->chipType >= SI32280
+      && hProslic->deviceId->chipType <= SI32289)
+  {
+    return Si3228x_PCMSetup(hProslic,preset);
+  }
+#endif
+#else
+  SILABS_UNREFERENCED_PARAMETER(hProslic);
+  SILABS_UNREFERENCED_PARAMETER(preset);
+#endif /*DISABLE_PCM_SETUP*/
+  return RC_COMPLETE_NO_ERR;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_PCMTimeSlotSetup (proslicChanType_ptr pProslic, uInt16 rxcount,
+                              uInt16 txcount)
+{
+  uInt8 data;
+  TRACEPRINT(pProslic, "rx = %u tx = %u\n", rxcount, txcount);
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+  data = txcount & 0xff;
+  WriteReg(pProslic,pProslic->channel,PROSLIC_REG_PCMTXLO,data);
+
+  data = ReadReg(pProslic,pProslic->channel,PROSLIC_REG_PCMTXHI);
+  data &= 0x10;  /* keep TX_EDGE bit */
+  data |= ((txcount >> 8)&0x03) ;
+  WriteReg(pProslic,pProslic->channel,PROSLIC_REG_PCMTXHI,data);
+
+  data = rxcount & 0xff;
+  WriteReg(pProslic,pProslic->channel,PROSLIC_REG_PCMRXLO,data);
+
+  data = (rxcount >> 8) & 0x3; /* PCMRXHI has only 2 bits for timeslot */
+  /* add to the calculated timeslot values the non timeslot bits */
+  data |= (ReadReg(pProslic,pProslic->channel,PROSLIC_REG_PCMRXHI) & 0xFC);
+  WriteReg(pProslic,pProslic->channel,PROSLIC_REG_PCMRXHI,data);
+
+  return RC_NONE;
+}
+
+/*****************************************************************************************************/
+typedef ProslicInt proslicIntTypeMap[SI_MAX_INTERRUPTS][8];
+
+static int ProSLIC_ReadInterruptsHelper(proslicChanType_ptr pProslic,
+                                        uInt8 *regData, uInt8 numChannels)
+{
+  uInt8 i;
+  uInt8 intsActive;
+  uInt8 *currentData = regData;
+  SILABS_UNREFERENCED_PARAMETER(numChannels);
+
+  intsActive = ReadReg(pProslic, pProslic->channel, PROSLIC_REG_IRQ0);
+
+#ifdef PROSLIC_OPTIMIZE_INTERRUPTS
+  /* For dual channel devices, we need to shift the upper nibble for the second channel
+     if the caller requested the second channel.  We determine this by channel ID being
+     even or odd.  If this is NOT true - for example a Si3217x and then a Si3226x chipset
+     configuration on the same daisychain, then this optimization logic will not work */
+#if defined(SI3226X) || defined(SI3228X)
+  if( (numChannels != 0) && ((pProslic->channel) & 0x1))
+  {
+    intsActive = intsActive >> 4;
+  }
+#endif /* Multichannel devices */
+#endif
+
+  /* If there are no interrupts, stop... return back to calling function */
+  if((intsActive &0xF) == 0)
+  {
+    return RC_IGNORE;
+  }
+
+  for(i = PROSLIC_REG_IRQ1; i <= PROSLIC_REG_IRQ4; i++)
+  {
+#ifdef PROSLIC_OPTIMIZE_INTERRUPTS
+    /* Read IRQn Register only if IRQ0 states there was an interrupt pending, otherwise
+       skip it. This eliminates unneeded SPI transactions.
+    */
+    if( (intsActive & (1<<(i-PROSLIC_REG_IRQ1))) == 0)
+    {
+      *currentData++ = 0;
+      continue;
+    }
+#endif
+    *currentData = (uInt8)ReadReg(pProslic, pProslic->channel, i);
+#ifdef GCI_MODDE
+    WriteReg(pProslic, pProslic->channel, i, *current_data);
+#endif
+    currentData++;
+  } /* for loop */
+
+  return RC_COMPLETE_NO_ERR;
+}
+
+/*
+ Reads IRQ0 to determine if an interrupt has occurred for the particular device,
+ if so, reads the interrupt register(s) that fired the interrupt and then
+ maps the interrupt(s) to the generic interrupt value to return to the caller.
+
+ Code assumes normal chipset/compatibility testing has already been done.
+*/
+static int ProSLIC_GetInterruptHelper(proslicChanType_ptr pProslic,
+                                      const proslicIntTypeMap intMap, proslicIntType *pIntData, uInt8 numChannels)
+{
+  int i,j;
+  uInt8 intData[SI_MAX_INTERRUPTS];
+  uInt8 *currentData;
+  uInt8 map, intCount;
+  BOOLEAN safetyInt = FALSE;
+
+  /* Initialize interrupt count to 0 */
+  pIntData-> number = 0;
+
+  if( ProSLIC_ReadInterruptsHelper(pProslic, intData, numChannels) == RC_IGNORE)
+  {
+    /* No interrupts for the given channel. */
+    return RC_NONE;
+  }
+
+  /* At this point we've collected all the registers, now decode the data */
+  currentData = intData;
+  intCount = 0;
+
+  for(i = 0; i < SI_MAX_INTERRUPTS; i++)
+  {
+    if(*currentData)
+    {
+      for(j = 0; j < 8; j++)
+      {
+        if( *currentData & (1<<j) )
+        {
+          map = intMap[i][j];
+          pIntData->irqs[intCount] = map;
+
+          if( (map == IRQ_P_HVIC)
+              || (map == IRQ_P_THERM) )
+          {
+            safetyInt = TRUE;
+          }
+
+          intCount++;
+        }
+      }
+    }
+    currentData++;
+  }
+  
+  pIntData->number = intCount;
+  
+  if( safetyInt == TRUE)
+  {
+    if(ProSLIC_isReinitRequired(pProslic))
+    {
+      return RC_REINIT_REQUIRED;
+    }
+  }
+
+  return pIntData->number;
+}
+
+
+int ProSLIC_GetInterrupts (proslicChanType_ptr hProslic,
+                           proslicIntType *pIntData)
+{
+  const proslicIntTypeMap interruptMap =
+  {
+    {IRQ_OSC1_T1, IRQ_OSC1_T2, IRQ_OSC2_T1, IRQ_OSC2_T2, IRQ_RING_T1, IRQ_RING_T2, IRQ_FSKBUF_AVAIL, IRQ_VBAT},
+    {IRQ_RING_TRIP, IRQ_LOOP_STATUS, IRQ_LONG_STAT, IRQ_VOC_TRACK, IRQ_DTMF, IRQ_INDIRECT, IRQ_RXMDM, IRQ_TXMDM},
+    {IRQ_P_HVIC, IRQ_P_THERM, IRQ_PQ3, IRQ_PQ4, IRQ_PQ5, IRQ_PQ6, IRQ_DSP, IRQ_MADC_FS},
+    {IRQ_USER_0, IRQ_USER_1, IRQ_USER_2, IRQ_USER_3, IRQ_USER_4, IRQ_USER_5, IRQ_USER_6, IRQ_USER_7}
+  };
+
+  pIntData->number=0;
+  /* TRACEPRINT(hProslic, "\n", NULL); */
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+#if defined (SI3217X) || defined (SI3218X) || defined(SI3219X)
+  if (0
+#ifdef SI3217X
+      || (hProslic->deviceId->chipType >= SI32171
+          && hProslic->deviceId->chipType <= SI32179)
+#endif
+#ifdef SI3218X
+      || (hProslic->deviceId->chipType >= SI32180
+          && hProslic->deviceId->chipType <= SI32189)
+#endif
+#ifdef SI3219X
+      || ( IS_SI3219X(hProslic->deviceId) )
+#endif
+     )
+  {
+    return ProSLIC_GetInterruptHelper(hProslic, interruptMap, pIntData, 1);
+  }
+#endif
+#if defined (SI3226X) || defined (SI3228X)
+  if( 0
+#ifdef SI3226X
+      || (hProslic->deviceId->chipType >= SI32260
+          && hProslic->deviceId->chipType <= SI32269)
+#endif
+#ifdef SI3228X
+      || (hProslic->deviceId->chipType >= SI32280
+          && hProslic->deviceId->chipType <= SI32289)
+#endif
+    )
+  {
+    return ProSLIC_GetInterruptHelper(hProslic, interruptMap, pIntData, 2);
+  }
+#endif
+  return RC_COMPLETE_NO_ERR;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_ReadHookStatus (proslicChanType_ptr pProslic,uInt8 *pHookStat)
+{
+  TRACEPRINT(pProslic, "\n", NULL);
+  *pHookStat = PROSLIC_ONHOOK;
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+  if (ReadReg(pProslic,pProslic->channel,PROSLIC_REG_LCRRTP) & 2)
+  {
+    *pHookStat=PROSLIC_OFFHOOK;
+  }
+  return RC_NONE;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_SetLinefeedStatus (proslicChanType_ptr pProslic, uInt8 newLinefeed)
+{
+  uInt8 lfState;
+  uInt8 irqen1=0;
+  TRACEPRINT(pProslic, "linefeed = %u\n", newLinefeed);
+  
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+  /* Get the irqen1 setting - used to determine if vbat interrupt was set... */
+#ifdef SI3217X
+  if (pProslic->deviceId->chipType >= SI32171
+    && pProslic->deviceId->chipType <= SI32179)
+  {
+      irqen1 = Si3217x_General_Configuration.irqen1;
+  }
+#endif
+
+#ifdef SI3218X
+  if (pProslic->deviceId->chipType >= SI32180
+    && pProslic->deviceId->chipType <= SI32189)
+  {
+      irqen1 = Si3218x_General_Configuration.irqen1;
+  }
+#endif
+
+#ifdef SI3219X
+  if ( IS_SI3219X(pProslic->deviceId) )
+  {
+      irqen1 = Si3219x_General_Configuration.irqen1;
+  }
+#endif
+
+#ifdef SI3226X
+  if (pProslic->deviceId->chipType >= SI32260
+    && pProslic->deviceId->chipType <= SI32269)
+  {
+      irqen1 = Si3226x_General_Configuration.irqen1;
+  }
+#endif
+
+#ifdef SI3228X
+  if (pProslic->deviceId->chipType >= SI32280
+    && pProslic->deviceId->chipType <= SI32289)
+  {
+      irqen1 = Si3228x_General_Configuration.irqen1;
+  }
+#endif
+
+  if( (newLinefeed& 0xF)  == LF_RINGING )
+  {
+    uInt8 regTemp;
+
+    lfState = ReadReg(pProslic, pProslic->channel, PROSLIC_REG_LINEFEED);
+
+    /* Only change to ringing state if not ringing... */
+    if( (lfState & 0xF) != LF_RINGING )
+    {
+      if(irqen1 & 0x80)
+      {
+        /*disable vbat interrupt during ringing*/
+        regTemp = ReadReg(pProslic, pProslic->channel, PROSLIC_REG_IRQEN1 );
+        WriteReg (pProslic, pProslic->channel, PROSLIC_REG_IRQEN1, regTemp&(~0x80));
+      }
+
+      WriteReg(pProslic, pProslic->channel, PROSLIC_REG_LINEFEED, LF_RINGING);
+    }
+    else
+    {
+      return RC_IGNORE;
+    }
+  }
+  else
+  {
+    uInt8 autord;
+
+    /* Preserve the auto register so we can restore it at the end */
+    autord = ReadReg(pProslic, pProslic->channel, PROSLIC_REG_AUTORD );
+    WriteReg(pProslic, pProslic->channel, PROSLIC_REG_AUTORD, (autord & 0xFB) ); /* Disable AutoRD */
+
+    lfState = ReadReg(pProslic, pProslic->channel, PROSLIC_REG_LINEFEED);
+
+    if( (lfState & 0xF) == LF_RINGING ) 
+    {
+      WriteReg(pProslic, pProslic->channel, PROSLIC_REG_LINEFEED, newLinefeed);
+    }
+    else
+    {
+      /* We are already doing a state transition, abort request */
+      if( ((lfState & 0xF0) == (LF_RINGING << 4) )
+        && ( (lfState & 0xF) != LF_RINGING) )
+      {
+        WriteReg(pProslic, pProslic->channel, PROSLIC_REG_AUTORD, autord ); /* restore the autord bit */
+        return RC_IGNORE;
+      }
+
+      WriteReg(pProslic, pProslic->channel, PROSLIC_REG_LINEFEED, newLinefeed);
+    }
+    /* Restore autord */
+    WriteReg(pProslic, pProslic->channel, PROSLIC_REG_AUTORD, autord );
+
+    /* Restore IRQEN1 to what the user specified - if we changed it.. */
+    if(irqen1 & 0x80)
+    {
+      WriteReg (pProslic, pProslic->channel, PROSLIC_REG_IRQEN1, irqen1);
+    }
+  }
+  return RC_NONE;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_SetLinefeedStatusBroadcast (proslicChanType_ptr hProslic,
+                                        uInt8 newLinefeed)
+{
+  TRACEPRINT(hProslic, "linefeed = %u\n", newLinefeed);
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+  WriteReg(hProslic, PROSLIC_CHAN_BROADCAST, PROSLIC_REG_LINEFEED, newLinefeed);
+  return RC_COMPLETE_NO_ERR;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_PolRev (proslicChanType_ptr pProslic,uInt8 abrupt,
+                    uInt8 newPolRevState)
+{
+  uInt8 data = 0;
+  TRACEPRINT(pProslic, "abrupt = %u newPolRevState = %u\n", abrupt,
+             newPolRevState);
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+  switch (newPolRevState)
+  {
+    case POLREV_STOP:
+      data = 0;
+      break;
+    case POLREV_START:
+      data = 2;
+      break;
+    case WINK_START:
+      data = 6;
+      break;
+    case WINK_STOP:
+      data = 4;
+      break;
+  }
+
+  /* Cannot polrev/wink while low power mode is active */
+  ProSLIC_SetPowersaveMode(pProslic,PWRSAVE_DISABLE);
+
+  if (abrupt)
+  {
+    data |= 1;
+  }
+
+  WriteReg(pProslic, pProslic->channel, PROSLIC_REG_POLREV,data);
+
+  return RC_NONE;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_GPIOControl (proslicChanType_ptr pProslic,uInt8 *pGpioData,
+                         uInt8 read)
+{
+  TRACEPRINT(pProslic, "\n", NULL);
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+#if defined(SI3217X) || defined (SI3226X)
+  if( 0
+#ifdef SI3217X
+      || (pProslic->deviceId->chipType >= SI32171
+          && pProslic->deviceId->chipType <= SI32179)
+#endif
+#ifdef SI3226X
+      || (pProslic->deviceId->chipType >= SI32260
+          && pProslic->deviceId->chipType <= SI32269)
+#endif
+    )
+  {
+    if (read)
+    {
+      *pGpioData = 0xf & ReadReg(pProslic,pProslic->channel,PROSLIC_REG_GPIO);
+    }
+    else
+    {
+      WriteReg(pProslic,pProslic->channel,PROSLIC_REG_GPIO,
+               (*pGpioData)|(ReadReg(pProslic,pProslic->channel,PROSLIC_REG_GPIO)&0xf0));
+    }
+    return RC_NONE;
+  }
+#else
+  SILABS_UNREFERENCED_PARAMETER(read);
+  SILABS_UNREFERENCED_PARAMETER(pGpioData);
+#endif 
+  return RC_COMPLETE_NO_ERR;
+}
+
+/*****************************************************************************************************/
+/*
+** Optional Neon Message Waiting Support
+*/
+#ifdef SIVOICE_NEON_MWI_SUPPORT
+int ProSLIC_MWISetV (proslicChanType_ptr hProslic, uInt16 vpk_mag)
+{
+  uInt32 ram_val;
+  uInt8 max;
+  
+  TRACEPRINT(hProslic, "vpk_mag = %u\n", vpk_mag);
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+  
+  /* Set the maximum MWI voltage according to the chipset */
+#if defined (SI3217X) || defined (SI3226X)
+  if( 0
+#ifdef SI3217X
+      || (hProslic->deviceId->chipType >= SI32171
+          && hProslic->deviceId->chipType <= SI32179)
+#endif
+#ifdef SI3226X
+      || (hProslic->deviceId->chipType >= SI32260
+          && hProslic->deviceId->chipType <= SI32269)
+#endif
+    )
+  {
+    max = SIL_MWI_VPK_MAX;
+  }
+#endif /*17x/26x */
+
+#if defined (SI3218X) || defined (SI3228X) || defined(SI3219X)
+  if( 0
+#ifdef SI3218X
+    || (hProslic->deviceId->chipType >= SI32180
+      && hProslic->deviceId->chipType <= SI32189)
+#endif
+
+#ifdef SI3228X
+    || (hProslic->deviceId->chipType >= SI32280
+      && hProslic->deviceId->chipType <= SI32289)
+#endif
+
+#ifdef SI3219X
+    || IS_SI3219X(hProslic->deviceId) 
+#endif
+
+#ifdef SI3228X
+      || (hProslic->deviceId->chipType >= SI32280
+          && hProslic->deviceId->chipType <= SI32289)
+#endif
+    )
+  {
+    max = SIL_MWI_VPK_MAX_LO;
+  }
+#endif /* 18x, 28x, 19x */
+
+  /* Voltage mod */
+  if(vpk_mag > 0)  /* Skip if 0 passed */
+  {
+    /* Clamp supplied value to allowable range */
+    if(vpk_mag > max)
+    {
+      vpk_mag = max;
+    }
+    if(vpk_mag < SIL_MWI_VPK_MIN)
+    {
+      vpk_mag = SIL_MWI_VPK_MIN;
+    }
+    ram_val = vpk_mag * SCALE_R_MADC * 1000L;
+    WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_MWI_V,ram_val);
+  }
+  return RC_COMPLETE_NO_ERR;
+}
+#endif
+
+/*****************************************************************************************************/
+#ifdef SIVOICE_NEON_MWI_SUPPORT
+int ProSLIC_MWIEnable (proslicChanType_ptr hProslic)
+{
+  uInt8 val;
+  ramData ram_val;
+  
+  TRACEPRINT(hProslic, "\n", NULL);
+  
+  /*
+  ** Check for conditions that would prevent enabling MWI
+  */
+  ProSLIC_ReadHookStatus(hProslic,&val);
+  if(val != PROSLIC_ONHOOK)
+  {
+    return RC_MWI_ENABLE_FAIL;
+  }
+  
+  val = ReadReg(hProslic,hProslic->channel,PROSLIC_REG_USERSTAT);
+
+  /* Check if PROSLIC and disabled MWI, if not, ignore this request. */
+  if( (hProslic->channelType != PROSLIC)
+       || (val & SIL_MWI_USTAT_SET ) )
+  {
+    return RC_IGNORE;
+  }
+  
+  /* Save parameters */
+  hProslic->mwiSave.ringof = ReadRAM(hProslic,hProslic->channel,PROSLIC_RAM_RINGOF);
+  hProslic->mwiSave.ringamp = ReadRAM(hProslic,hProslic->channel,PROSLIC_RAM_RINGAMP);
+  hProslic->mwiSave.vbatr_expect = ReadRAM(hProslic,hProslic->channel,PROSLIC_RAM_VBATR_EXPECT);
+  hProslic->mwiSave.vov_ring_bat = ReadRAM(hProslic,hProslic->channel,PROSLIC_RAM_VOV_RING_BAT);
+  hProslic->mwiSave.vov_ring_gnd = ReadRAM(hProslic,hProslic->channel,PROSLIC_RAM_VOV_RING_GND);
+  hProslic->mwiSave.rtacth = ReadRAM(hProslic,hProslic->channel,PROSLIC_RAM_RTACTH);
+  hProslic->mwiSave.rtdcth = ReadRAM(hProslic,hProslic->channel,PROSLIC_RAM_RTDCTH);
+  hProslic->mwiSave.iring_lim = ReadRAM(hProslic,hProslic->channel,PROSLIC_RAM_IRING_LIM);
+  hProslic->mwiSave.dcdc_rngtype = ReadRAM(hProslic,hProslic->channel,PROSLIC_RAM_DCDC_RNGTYPE);
+  hProslic->mwiSave.slope_ring = ReadRAM(hProslic,hProslic->channel,PROSLIC_RAM_SLOPE_RING);
+  hProslic->mwiSave.rtper = ReadRAM(hProslic,hProslic->channel,PROSLIC_RAM_RTPER);
+  hProslic->mwiSave.ringfr = ReadRAM(hProslic,hProslic->channel,PROSLIC_RAM_RINGFR);
+  hProslic->mwiSave.rtdcdb = ReadRAM(hProslic,hProslic->channel,PROSLIC_RAM_RTDCDB);
+  hProslic->mwiSave.lcrmask = ReadRAM(hProslic,hProslic->channel,PROSLIC_RAM_LCRMASK);
+  hProslic->mwiSave.dcdc_oithresh_lo = ReadRAM(hProslic,hProslic->channel,PROSLIC_RAM_DCDC_OITHRESH_LO);
+  hProslic->mwiSave.enhance = ReadReg(hProslic,hProslic->channel,PROSLIC_REG_ENHANCE);
+  hProslic->mwiSave.ringcon = ReadReg(hProslic,hProslic->channel,PROSLIC_REG_RINGCON);
+  hProslic->mwiSave.userstat =  val;
+  hProslic->mwiSave.linefeed = ReadReg(hProslic,hProslic->channel,PROSLIC_REG_LINEFEED);
+  
+  /* Modify parameters */
+  ProSLIC_SetLinefeedStatus(hProslic,LF_FWD_ACTIVE);
+  ram_val = ReadRAM(hProslic,hProslic->channel,PROSLIC_RAM_MWI_V);
+  WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_RINGOF,ram_val);
+  WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_RINGAMP,0x0L);
+
+  /* Set the VBATR_EXPECT according to the chipset */
+#if defined (SI3217X) || defined (SI3226X)
+  if( 0
+#ifdef SI3217X
+      || (hProslic->deviceId->chipType >= SI32171
+          && hProslic->deviceId->chipType <= SI32179)
+#endif
+#ifdef SI3226X
+      || (hProslic->deviceId->chipType >= SI32260
+          && hProslic->deviceId->chipType <= SI32269)
+#endif
+    )
+  {
+    ram_val = 0x7FFFFC2L;
+  }
+#endif
+
+#if defined (SI3218X) || defined (SI3228X) || defined(SI3219X)
+  if( 0
+#ifdef SI3218X
+      || (hProslic->deviceId->chipType >= SI32180
+          && hProslic->deviceId->chipType <= SI32189)
+#endif
+
+#ifdef SI3228X
+      || (hProslic->deviceId->chipType >= SI32280
+          && hProslic->deviceId->chipType <= SI32289)
+#endif
+
+#ifdef SI3219X
+    || IS_SI3219X(hProslic->deviceId) 
+#endif
+    )
+  {
+    ram_val = 0x06866635L;
+  }
+#endif /* 18x,28x, 19x */
+
+  WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_VBATR_EXPECT,ram_val);
+  WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_VOV_RING_BAT,0x0L);
+  WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_VOV_RING_GND,0x051EB80L);
+  WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_RTACTH,0x0FFFFFFFL);
+  WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_RTDCTH,0x38E38EL);
+  WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_IRING_LIM,0x380000L);
+  WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_DCDC_RNGTYPE,0x100000L);
+  WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_SLOPE_RING,0x15E5200EL);
+  WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_RTPER,0x50000L);
+  WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_RINGFR,0x07EFE000L);
+  WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_RTDCDB,0x0000A000L);
+  WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_LCRMASK,0x000F0000L);
+  ram_val = ReadRAM(hProslic,hProslic->channel,PROSLIC_RAM_DCDC_OITHRESH_HI);
+  WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_DCDC_OITHRESH_LO,ram_val);
+  WriteReg(hProslic,hProslic->channel,PROSLIC_REG_ENHANCE,hProslic->mwiSave.enhance&0xEF);
+  WriteReg(hProslic,hProslic->channel,PROSLIC_REG_RINGCON,0x00);
+  WriteReg(hProslic,hProslic->channel,PROSLIC_REG_USERSTAT,0x0C);
+  
+  return RC_COMPLETE_NO_ERR;
+}
+#endif
+
+/*****************************************************************************************************/
+#ifdef SIVOICE_NEON_MWI_SUPPORT
+int ProSLIC_MWIDisable (proslicChanType_ptr hProslic)
+{
+  TRACEPRINT(hProslic, "\n", NULL);
+
+  /* Check if PROSLIC and enabled MWI, if not, ignore this request. */
+  if( (hProslic->channelType != PROSLIC)
+       || !(ReadReg(hProslic,hProslic->channel,PROSLIC_REG_USERSTAT) & SIL_MWI_USTAT_SET ) )
+  {
+    return RC_IGNORE;
+  }
+
+  ProSLIC_SetLinefeedStatus(hProslic,LF_FWD_ACTIVE);
+  WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_RINGOF,hProslic->mwiSave.ringof);
+  WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_RINGAMP,hProslic->mwiSave.ringamp);
+  WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_VBATR_EXPECT,hProslic->mwiSave.vbatr_expect);
+  WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_VOV_RING_BAT,hProslic->mwiSave.vov_ring_bat);
+  WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_VOV_RING_GND,hProslic->mwiSave.vov_ring_gnd);
+  WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_RTACTH,hProslic->mwiSave.rtacth);
+  WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_RTDCTH,hProslic->mwiSave.rtdcth);
+  WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_IRING_LIM,hProslic->mwiSave.iring_lim);
+  WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_DCDC_RNGTYPE,hProslic->mwiSave.dcdc_rngtype);
+  WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_SLOPE_RING,hProslic->mwiSave.slope_ring);
+  WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_RTPER,hProslic->mwiSave.rtper);
+  WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_RINGFR,hProslic->mwiSave.ringfr);
+  WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_RTDCDB,hProslic->mwiSave.rtdcdb);
+  WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_LCRMASK,hProslic->mwiSave.lcrmask);
+  WriteRAM(hProslic,hProslic->channel,PROSLIC_RAM_DCDC_OITHRESH_LO,hProslic->mwiSave.dcdc_oithresh_lo);
+  WriteReg(hProslic,hProslic->channel,PROSLIC_REG_ENHANCE,hProslic->mwiSave.enhance);
+  WriteReg(hProslic,hProslic->channel,PROSLIC_REG_RINGCON,hProslic->mwiSave.ringcon);
+  WriteReg(hProslic,hProslic->channel,PROSLIC_REG_USERSTAT,hProslic->mwiSave.userstat);
+  ProSLIC_SetLinefeedStatus(hProslic,hProslic->mwiSave.linefeed);
+  
+  return RC_COMPLETE_NO_ERR;
+}
+#endif
+
+/*****************************************************************************************************/
+#ifdef SIVOICE_NEON_MWI_SUPPORT
+int ProSLIC_SetMWIState (proslicChanType_ptr hProslic,uInt8 flash_on)
+{
+  TRACEPRINT(hProslic, "flash_on = %u\n", flash_on);
+  /* Check if PROSLIC and enabled MWI, if not, ignore this request. */
+  if( (hProslic->channelType != PROSLIC)
+       || !(ReadReg(hProslic,hProslic->channel,PROSLIC_REG_USERSTAT) & SIL_MWI_USTAT_SET ) )
+  {
+    return RC_IGNORE;
+  }
+  
+  if(flash_on)
+  {
+    ProSLIC_SetLinefeedStatus(hProslic,LF_RINGING);
+  }
+  else
+  {
+    ProSLIC_SetLinefeedStatus(hProslic,LF_FWD_ACTIVE);
+  }
+  
+  return RC_COMPLETE_NO_ERR;
+}
+#endif
+
+/*****************************************************************************************************/
+#ifdef SIVOICE_NEON_MWI_SUPPORT
+int ProSLIC_GetMWIState (proslicChanType_ptr hProslic)
+{
+  TRACEPRINT(hProslic, "\n", NULL);
+  /* Check if PROSLIC and enabled MWI, if not, ignore this request. */
+  if( (hProslic->channelType != PROSLIC)
+       || !(ReadReg(hProslic,hProslic->channel,PROSLIC_REG_USERSTAT) & SIL_MWI_USTAT_SET ) )
+  {
+    return RC_IGNORE;
+  }
+  
+  if(ReadReg(hProslic,hProslic->channel,PROSLIC_REG_LINEFEED) == 0x44)
+  {
+    return SIL_MWI_FLASH_ON;
+  }
+  else
+  {
+    return SIL_MWI_FLASH_OFF;
+  }
+  
+  return RC_COMPLETE_NO_ERR;
+}
+#endif
+
+/******************************************************************************/
+#ifdef SIVOICE_NEON_MWI_SUPPORT
+int ProSLIC_MWIRampPoll(proslicChanType_ptr pProslic)
+{
+  uInt32 mwi_voltage;
+  
+  /* Check if PROSLIC and enabled MWI, if not, ignore this request. */
+  if( (pProslic->channelType != PROSLIC)
+       || !(ReadReg(pProslic,pProslic->channel,PROSLIC_REG_USERSTAT) & SIL_MWI_USTAT_SET ) )
+  {
+    return RC_IGNORE;
+  }
+  
+  switch(pProslic->mwiState.state)
+  {
+    case PROSLIC_MWI_RAMP_ON:
+    {
+      if(pProslic->mwiState.ticks == pProslic->mwiState.poll.steps)
+      {
+        mwi_voltage = pProslic->mwiState.poll.voff + pProslic->mwiState.poll.step_size;
+        WriteRAM(pProslic,pProslic->channel,PROSLIC_RAM_RINGOF,mwi_voltage);
+        ProSLIC_SetLinefeedStatus(pProslic,LF_RINGING);
+      }
+      else if(pProslic->mwiState.ticks == 0)
+      {
+        mwi_voltage = pProslic->mwiState.poll.von;
+        WriteRAM(pProslic,pProslic->channel,PROSLIC_RAM_RINGOF,mwi_voltage);
+        pProslic->mwiState.ticks = pProslic->mwiState.poll.onTime+1;
+        pProslic->mwiState.state = PROSLIC_MWI_ON;
+      }
+      else
+      {
+        mwi_voltage = pProslic->mwiState.poll.voff + pProslic->mwiState.poll.step_size*(pProslic->mwiState.poll.steps - pProslic->mwiState.ticks + 1);
+        WriteRAM(pProslic,pProslic->channel,PROSLIC_RAM_RINGOF,mwi_voltage);
+      }
+    }
+    break;
+
+    case PROSLIC_MWI_RAMP_OFF:
+    {
+      if(pProslic->mwiState.ticks == 0)
+      {
+        pProslic->mwiState.ticks = pProslic->mwiState.poll.offTime+1;
+        pProslic->mwiState.state = PROSLIC_MWI_OFF;
+        ProSLIC_SetLinefeedStatus(pProslic,LF_FWD_ACTIVE);
+        }
+      else 
+      {
+        mwi_voltage = pProslic->mwiState.poll.von - (pProslic->mwiState.poll.steps - pProslic->mwiState.ticks + 1)*pProslic->mwiState.poll.step_size;
+        WriteRAM(pProslic,pProslic->channel,PROSLIC_RAM_RINGOF,mwi_voltage);
+      }
+    break;
+    }
+    
+    case PROSLIC_MWI_ON:
+      if(pProslic->mwiState.ticks == 0)
+      {
+        pProslic->mwiState.ticks = pProslic->mwiState.poll.steps+1;
+        pProslic->mwiState.state = PROSLIC_MWI_RAMP_OFF;
+      }
+      break;
+      
+    case PROSLIC_MWI_OFF:
+      if(pProslic->mwiState.ticks == 0)
+      {
+        pProslic->mwiState.ticks = pProslic->mwiState.poll.steps+1;
+        pProslic->mwiState.state = PROSLIC_MWI_RAMP_ON;
+      }
+      break;
+
+    default:
+      /* Do nothing */
+      break;
+  }
+  (pProslic->mwiState.ticks)--; 
+
+  return RC_COMPLETE_NO_ERR;
+}
+#endif
+
+/******************************************************************************/
+#ifdef SIVOICE_NEON_MWI_SUPPORT
+int ProSLIC_MWIRampStart(proslicChanType_ptr pProslic, uInt32 steps, uInt32 onTime, uInt32 offTime)
+{
+  /* Check if PROSLIC and enabled MWI, if not, ignore this request. */
+  if( (pProslic->channelType != PROSLIC)
+       || !(ReadReg(pProslic,pProslic->channel,PROSLIC_REG_USERSTAT) & SIL_MWI_USTAT_SET ) )
+  {
+    return RC_IGNORE;
+  }
+  
+  pProslic->mwiState.poll.steps = steps-1;
+  pProslic->mwiState.poll.onTime = onTime;
+  pProslic->mwiState.poll.offTime = offTime;
+  
+  pProslic->mwiState.poll.von = ReadRAM(pProslic,pProslic->channel,PROSLIC_RAM_MWI_V);
+  pProslic->mwiState.poll.voff = (ReadRAM(pProslic,pProslic->channel,PROSLIC_RAM_V_VLIM)*5)/6;
+  pProslic->mwiState.poll.step_size = (pProslic->mwiState.poll.von - pProslic->mwiState.poll.voff)/steps;
+  
+  pProslic->mwiState.state = PROSLIC_MWI_RAMP_ON;
+  pProslic->mwiState.ticks = pProslic->mwiState.poll.steps;
+
+  return RC_COMPLETE_NO_ERR;
+}
+#endif
+
+/******************************************************************************/
+#ifdef SIVOICE_NEON_MWI_SUPPORT
+int ProSLIC_MWIRampStop(proslicChanType_ptr pProslic)
+{
+  /* Check if PROSLIC and enabled MWI, if not, ignore this request. */
+  if( (pProslic->channelType != PROSLIC)
+       || !(ReadReg(pProslic,pProslic->channel,PROSLIC_REG_USERSTAT) & SIL_MWI_USTAT_SET ) )
+  {
+    return RC_IGNORE;
+  }
+  pProslic->mwiState.state = PROSLIC_MWI_OFF;
+  
+  return RC_COMPLETE_NO_ERR;
+}
+#endif
+
+/*****************************************************************************************************/
+int ProSLIC_ToneGenStart (proslicChanType_ptr pProslic,uInt8 timerEn)
+{
+  uInt8 data;
+  TRACEPRINT(pProslic, "timerEn = %u\n", timerEn);
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+  DEBUG_PRINT(pProslic, "%s%s on channel %d\n",LOGPRINT_PREFIX, __FUNCTION__,
+              pProslic->channel);
+
+  data = ReadReg(pProslic,pProslic->channel,PROSLIC_REG_OCON);
+  data |= 0x11 + (timerEn ? 0x66 : 0);
+  return WriteReg(pProslic,pProslic->channel,PROSLIC_REG_OCON,data);
+}
+
+/*****************************************************************************************************/
+int ProSLIC_ToneGenStop (proslicChanType_ptr pProslic)
+{
+  uInt8 data;
+  TRACEPRINT(pProslic, "\n", NULL);
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+  DEBUG_PRINT(pProslic,"%s%s on channel %d\n",LOGPRINT_PREFIX, __FUNCTION__,
+              pProslic->channel);
+  data = ReadReg(pProslic,pProslic->channel,PROSLIC_REG_OCON);
+  data &= ~(0x77);
+  return WriteReg(pProslic,pProslic->channel,PROSLIC_REG_OCON,data);
+}
+
+/*****************************************************************************************************/
+int ProSLIC_RingStart (proslicChanType_ptr pProslic)
+{
+  TRACEPRINT(pProslic, "\n", NULL);
+  return(ProSLIC_SetLinefeedStatus(pProslic, LF_RINGING));
+}
+
+/*****************************************************************************************************/
+int ProSLIC_RingStop (proslicChanType_ptr pProslic)
+{
+  TRACEPRINT(pProslic, "\n", NULL);
+  return(ProSLIC_SetLinefeedStatus(pProslic, LF_FWD_ACTIVE));
+}
+
+#ifndef DISABLE_FSK_SETUP
+/*****************************************************************************************************/
+int ProSLIC_CheckCIDBuffer (proslicChanType_ptr pProslic, uInt8 *fsk_buf_avail)
+{
+  uInt8 data;
+  TRACEPRINT(pProslic, "\n", NULL);
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+  data = ReadReg(pProslic,pProslic->channel, PROSLIC_REG_IRQ1);
+#ifdef GCI_MODE
+  WriteReg(pProslic,pProslic->channel, PROSLIC_REG_IRQ1,data); /*clear (for GCI)*/
+#endif
+  *fsk_buf_avail = (data&0x40) ? 1 : 0;
+  return RC_NONE;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_EnableCID (proslicChanType_ptr pProslic)
+{
+  uInt8 data;
+  TRACEPRINT(pProslic, "\n", NULL);
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+  DEBUG_PRINT(pProslic, "%sEnableCID on channel %d\n",LOGPRINT_PREFIX,
+              pProslic->channel);
+  WriteReg(pProslic,pProslic->channel,PROSLIC_REG_OCON,0);
+
+  data = ReadReg(pProslic,pProslic->channel,PROSLIC_REG_OMODE);
+  data |= 0xA;
+  WriteReg(pProslic,pProslic->channel,PROSLIC_REG_OMODE,data);
+
+  return(WriteReg(pProslic,pProslic->channel,PROSLIC_REG_OCON,0x5));
+}
+
+/*****************************************************************************************************/
+int ProSLIC_DisableCID (proslicChanType_ptr pProslic)
+{
+  uInt8 data;
+  TRACEPRINT(pProslic, "\n", NULL);
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+  DEBUG_PRINT(pProslic, "%sDisableCID on channel %d\n",LOGPRINT_PREFIX,
+              pProslic->channel);
+  WriteReg(pProslic,pProslic->channel,PROSLIC_REG_OCON,0);
+  data = ReadReg(pProslic,pProslic->channel,PROSLIC_REG_OMODE);
+  data &= ~(0x8);
+
+  return(WriteReg(pProslic,pProslic->channel,PROSLIC_REG_OMODE,data));
+}
+
+/*****************************************************************************************************/
+int ProSLIC_SendCID (proslicChanType_ptr pProslic, uInt8 *buffer,
+                     uInt8 numBytes)
+{
+  TRACEPRINT(pProslic, "numBytes = %u\n", numBytes);
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+  DEBUG_PRINT (pProslic, "%sSendCID on channel %d\n",LOGPRINT_PREFIX,
+               pProslic->channel);
+  while (numBytes-- > 0)
+  {
+    WriteReg(pProslic,pProslic->channel,PROSLIC_REG_FSKDAT,*(buffer++));
+  }
+  return RC_NONE;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_ModifyCIDStartBits(proslicChanType_ptr pProslic,
+                               uInt8 enable_startStop)
+{
+  uInt8 data;
+  TRACEPRINT(pProslic, "enable_startStop = %u\n", enable_startStop);
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_CHANNEL_TYPE_ERR;
+  }
+
+  data = ReadReg(pProslic,pProslic->channel,PROSLIC_REG_OMODE);
+
+  if(enable_startStop == FALSE)
+  {
+    data &= ~0x80;
+  }
+  else
+  {
+    data |= 0x80;
+  }
+
+  WriteReg(pProslic,pProslic->channel,PROSLIC_REG_OMODE,data);
+
+  return RC_NONE;
+}
+#endif /* DISABLE_FSK_SETUP */
+/*****************************************************************************************************/
+int ProSLIC_PCMStart (proslicChanType_ptr pProslic)
+{
+  uInt8 data;
+  TRACEPRINT(pProslic, "\n", NULL);
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+  DEBUG_PRINT(pProslic, "%sPCMStart\n", LOGPRINT_PREFIX);
+  data = ReadReg(pProslic,pProslic->channel,PROSLIC_REG_PCMMODE);
+  data |= 0x10;
+
+  return WriteReg(pProslic,pProslic->channel,PROSLIC_REG_PCMMODE,data);
+}
+
+/*****************************************************************************************************/
+int ProSLIC_PCMStop (proslicChanType_ptr pProslic)
+{
+  uInt8 data;
+  TRACEPRINT(pProslic, "\n", NULL);
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+  DEBUG_PRINT(pProslic, "%sPCMStart\n", LOGPRINT_PREFIX);
+  data = ReadReg(pProslic,pProslic->channel,PROSLIC_REG_PCMMODE);
+  data &= ~0x10;
+
+  return WriteReg(pProslic,pProslic->channel,PROSLIC_REG_PCMMODE,data);
+}
+
+#ifndef DISABLE_HOOKCHANGE
+/*****************************************************************************************************/
+/*
+** Function: ProSLIC_ResetDialPulseDetect
+**
+** Description:
+** reset dial pulse detection state machine (helper function for
+** ProSLIC_InitializeHookChangeDetect.
+*/
+static void ProSLIC_ResetDialPulseDetect(hookChangeType *pPulse)
+{
+  pPulse->currentPulseDigit = 0;
+  pPulse->lookingForTimeout = 0;
+}
+
+/*****************************************************************************************************/
+/*
+** Function: ProSLIC_InitializeHookChangeDetect
+**
+** Description:
+** Initialize dial pulse detection parameters
+*/
+int ProSLIC_InitializeHookChangeDetect(hookChangeType *pPulse,void *hookTime)
+{
+  TRACEPRINT_NOCHAN("\n", NULL);
+  pPulse->hookTime = hookTime;
+  pPulse->last_state_reported =  SI_HC_NO_ACTIVITY;
+  ProSLIC_ResetDialPulseDetect(pPulse);
+  return RC_NONE;
+}
+
+/*****************************************************************************************************/
+/*
+** Function: ProSLIC_HookChangeDetect
+**
+** Description:
+** implements pulse dial detection and should be called at every hook transition
+*/
+uInt8 ProSLIC_HookChangeDetect (proslicChanType *pProslic,
+                                hookChange_Cfg *pHookChangeCfg, hookChangeType *pHookChangeData)
+{
+  uInt8 hookStat;
+  int delta_time;
+
+  TRACEPRINT(pProslic, "\n", NULL);
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+  TimeElapsed(pProTimer,pHookChangeData->hookTime,&delta_time);
+  ProSLIC_ReadHookStatus(pProslic,&hookStat);
+
+  /* Did we have a hook state change? */
+  if(hookStat !=  pHookChangeData->last_hook_state)
+  {
+    pHookChangeData->last_hook_state = hookStat;
+    getTime(pProTimer,pHookChangeData->hookTime);
+    pHookChangeData->lookingForTimeout = 1;
+    if (hookStat == PROSLIC_OFFHOOK)
+    {
+      if ((delta_time >= (pHookChangeCfg->minOnHook))
+          && (delta_time <= (pHookChangeCfg->maxOnHook)))
+      {
+        pHookChangeData->currentPulseDigit++;
+      }
+      else
+      {
+        /* Did we see a hook flash? */
+        if( (delta_time >= pHookChangeCfg->minHookFlash)
+            && (delta_time <= pHookChangeCfg->maxHookFlash) )
+        {
+          pHookChangeData->last_state_reported = SI_HC_HOOKFLASH;
+          ProSLIC_ResetDialPulseDetect(pHookChangeData);
+          return SI_HC_HOOKFLASH;
+        }
+      }
+    }
+
+    return SI_HC_NEED_MORE_POLLS;
+  }
+
+  if( (pHookChangeData->lookingForTimeout == 1)
+      && (delta_time >=  pHookChangeCfg->minInterDigit) )
+  {
+
+    if(delta_time  > pHookChangeCfg->minHook)
+    {
+      if(pHookChangeData->last_hook_state == PROSLIC_ONHOOK)
+      {
+        ProSLIC_ResetDialPulseDetect(pHookChangeData);
+        pHookChangeData->last_state_reported = SI_HC_ONHOOK_TIMEOUT;
+        return SI_HC_ONHOOK_TIMEOUT;
+      }
+
+      if(pHookChangeData->last_hook_state == PROSLIC_OFFHOOK)
+      {
+        ProSLIC_ResetDialPulseDetect(pHookChangeData);
+
+        /* Check if we saw either a pulse digit or hook flash prior to this,
+         * if so, we're already offhook, so do not report a offhook event,
+         * just stop polling.
+         */
+        if((pHookChangeData->last_state_reported == SI_HC_ONHOOK_TIMEOUT)
+            || (pHookChangeData->last_state_reported == SI_HC_NO_ACTIVITY) )
+        {
+          pHookChangeData->last_state_reported = SI_HC_OFFHOOK_TIMEOUT;
+          return SI_HC_OFFHOOK_TIMEOUT;
+        }
+        else
+        {
+          return SI_HC_NO_ACTIVITY;
+        }
+      }
+    }
+    else
+    {
+      uInt8 last_digit = pHookChangeData->currentPulseDigit;
+
+      if(last_digit)
+      {
+        pHookChangeData->last_state_reported = last_digit;
+        ProSLIC_ResetDialPulseDetect(pHookChangeData);
+        return last_digit;
+      }
+    }
+    return SI_HC_NEED_MORE_POLLS;
+  }
+
+  return SI_HC_NEED_MORE_POLLS;
+}
+#endif /* DISABLE_HOOKCHANGE */
+
+/*****************************************************************************************************/
+int ProSLIC_DTMFReadDigit (proslicChanType_ptr pProslic,uInt8 *pDigit)
+{
+  TRACEPRINT(pProslic, "\n", NULL);
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+  DEBUG_PRINT(pProslic, "%sDTMFReadDigit on channel %d\n",LOGPRINT_PREFIX,
+              pProslic->channel);
+  *pDigit = ReadReg(pProslic,pProslic->channel,PROSLIC_REG_TONDTMF) & 0xf;
+
+  return RC_NONE;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_PLLFreeRunStart (proslicChanType_ptr hProslic)
+{
+  uInt8 tmp;
+  TRACEPRINT(hProslic, "\n", NULL);
+
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+  WriteReg(hProslic,hProslic->channel,PROSLIC_REG_ZCAL_EN,0x00);
+  tmp = ReadReg(hProslic,hProslic->channel,PROSLIC_REG_ENHANCE);
+
+  return(WriteReg(hProslic,hProslic->channel,PROSLIC_REG_ENHANCE,tmp|0x4));
+}
+
+/*****************************************************************************************************/
+int ProSLIC_PLLFreeRunStop (proslicChanType_ptr hProslic)
+{
+  uInt8 tmp;
+  TRACEPRINT(hProslic, "\n", NULL);
+
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+  tmp = ReadReg(hProslic,hProslic->channel,PROSLIC_REG_ENHANCE);
+  WriteReg(hProslic,hProslic->channel,PROSLIC_REG_ENHANCE,tmp&~(0x4));
+
+  return WriteReg(hProslic,hProslic->channel,PROSLIC_REG_ZCAL_EN,0x04);
+}
+
+/*****************************************************************************************************/
+int ProSLIC_GetPLLFreeRunStatus (proslicChanType_ptr hProslic)
+{
+  uInt8 tmp;
+  TRACEPRINT(hProslic, "\n", NULL);
+
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+  tmp = ReadReg(hProslic,hProslic->channel,PROSLIC_REG_ENHANCE);
+
+  if(tmp & 0x02)
+  {
+    return RC_PLL_FREERUN_ACTIVE;
+  }
+
+  return RC_NONE;
+}
+
+/*****************************************************************************************************/
+#ifndef DISABLE_PULSEMETERING
+int ProSLIC_PulseMeterEnable (proslicChanType_ptr hProslic)
+{
+  uInt8 widebandEn;
+  TRACEPRINT(hProslic, "\n", NULL);
+
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+  widebandEn = ReadReg(hProslic,hProslic->channel,PROSLIC_REG_ENHANCE) & 0x01;
+
+  if (widebandEn)
+  {
+    DEBUG_PRINT (hProslic,
+                 "%s Pulse Metering is not supported while Wideband Mode is enabled.\n",
+                 LOGPRINT_PREFIX);
+  }
+
+#if defined (SI3217X) || defined (SI3218X) || defined (SI3226X) || defined (SI3228X) || defined(SI3219X)
+  if(!widebandEn && (0 
+#ifdef SI3217X
+      || (hProslic->deviceId->chipType >= SI32171
+          && hProslic->deviceId->chipType <= SI32179)
+#endif
+#ifdef SI3218X
+      ||(hProslic->deviceId->chipType >= SI32180
+         && hProslic->deviceId->chipType <= SI32189) 
+#endif
+#ifdef SI3219X
+      || (IS_SI3219X(hProslic->deviceId) )
+#endif
+#ifdef SI3226X
+      || (hProslic->deviceId->chipType >= SI32260
+          && hProslic->deviceId->chipType <= SI32269)
+#endif
+#ifdef SI3228X
+      || (hProslic->deviceId->chipType >= SI32280
+          && hProslic->deviceId->chipType <= SI32289 )
+#endif
+    ))
+  {
+    return WriteReg(hProslic,hProslic->channel,PROSLIC_REG_PMCON,ReadReg(hProslic,
+                    hProslic->channel,PROSLIC_REG_PMCON) | (0x01));
+  }
+#endif
+  return RC_COMPLETE_NO_ERR;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_PulseMeterDisable (proslicChanType_ptr hProslic)
+{
+  TRACEPRINT(hProslic, "\n", NULL);
+
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+  return(WriteReg(hProslic,hProslic->channel,PROSLIC_REG_PMCON,ReadReg(hProslic,
+                  hProslic->channel,PROSLIC_REG_PMCON) & ~(0x05)));
+}
+
+/*****************************************************************************************************/
+int ProSLIC_PulseMeterStart (proslicChanType_ptr hProslic)
+{
+  TRACEPRINT(hProslic, "\n", NULL);
+
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+  return WriteReg(hProslic,hProslic->channel,PROSLIC_REG_PMCON,ReadReg(hProslic,
+                  hProslic->channel,PROSLIC_REG_PMCON) | (0x5));
+}
+
+/*****************************************************************************************************/
+int ProSLIC_PulseMeterStop (proslicChanType_ptr hProslic)
+{
+  TRACEPRINT(hProslic, "\n", NULL);
+
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+#ifdef SI3217X
+  if (hProslic->deviceId->chipType >= SI32171
+      && hProslic->deviceId->chipType <= SI32179)
+  {
+    return(WriteReg(hProslic,hProslic->channel,PROSLIC_REG_PMCON,ReadReg(hProslic,
+                    hProslic->channel,PROSLIC_REG_PMCON) & ~(0x04)));
+  }
+#endif
+
+#ifdef SI3218X
+  if (hProslic->deviceId->chipType >= SI32180
+      && hProslic->deviceId->chipType <= SI32189)
+  {
+    return(WriteReg(hProslic,hProslic->channel,PROSLIC_REG_PMCON,ReadReg(hProslic,
+                    hProslic->channel,PROSLIC_REG_PMCON) & ~(0x04)));
+  }
+#endif
+
+#ifdef SI3219X
+  if ( IS_SI3219X(hProslic->deviceId) )
+  {
+    return(WriteReg(hProslic,hProslic->channel,PROSLIC_REG_PMCON,ReadReg(hProslic,
+                    hProslic->channel,PROSLIC_REG_PMCON) & ~(0x04)));
+  }
+#endif
+
+#ifdef SI3226X
+  if (hProslic->deviceId->chipType >= SI32260
+      && hProslic->deviceId->chipType <= SI32269)
+  {
+    return ProSLIC_PulseMeterDisable(hProslic);
+  }
+#endif
+
+#ifdef SI3228X
+  if (hProslic->deviceId->chipType >= SI32280
+      && hProslic->deviceId->chipType <= SI32289)
+  {
+    return ProSLIC_PulseMeterDisable(hProslic);
+  }
+#endif
+
+  return RC_COMPLETE_NO_ERR;
+}
+#endif /* DISABLE_PULSEMETERING */
+/*****************************************************************************************************/
+int ProSLIC_SetDCDCInversionFlag (proslicChanType_ptr hProslic, uInt8 flag)
+{
+  TRACEPRINT(hProslic, "flag = %u\n", flag);
+
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+  hProslic->dcdc_polarity_invert = flag;
+
+  return RC_COMPLETE_NO_ERR;
+}
+
+
+int ProSLIC_PowerUpConverter (proslicChanType_ptr hProslic)
+{
+  if(hProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+#ifdef SI3217X
+  if (hProslic->deviceId->chipType >= SI32171
+      && hProslic->deviceId->chipType <= SI32179)
+  {
+    return Si3217x_PowerUpConverter(hProslic);
+  }
+#endif
+
+#ifdef SI3218X
+  if (hProslic->deviceId->chipType >= SI32180
+      && hProslic->deviceId->chipType <= SI32189)
+  {
+    return Si3218x_PowerUpConverter(hProslic);
+  }
+#endif
+
+#ifdef SI3219X
+  if ( IS_SI3219X(hProslic->deviceId) )
+  {
+    return Si3219x_PowerUpConverter(hProslic);
+  }
+#endif
+
+#ifdef SI3226X
+  if (hProslic->deviceId->chipType >= SI32260
+      && hProslic->deviceId->chipType <= SI32269)
+  {
+    return Si3226x_PowerUpConverter(hProslic);
+  }
+#endif
+
+#ifdef SI3228X
+  if (hProslic->deviceId->chipType >= SI32280
+      && hProslic->deviceId->chipType <= SI32289)
+  {
+    return Si3228x_PowerUpConverter(hProslic);
+  }
+#endif
+
+  return RC_COMPLETE_NO_ERR;
+}
+/*****************************************************************************************************/
+static int ProSLIC_GetBatType(proslicChanType_ptr hProslic)
+{
+#ifdef SI3226X
+  if (hProslic->deviceId->chipType >= SI32260
+      && hProslic->deviceId->chipType <= SI32269)
+  {
+    return Si3226x_General_Configuration.batType;
+  }
+#endif
+
+#ifdef SI3228X
+  if (hProslic->deviceId->chipType >= SI32280
+      && hProslic->deviceId->chipType <= SI32289)
+  {
+    return Si3228x_General_Configuration.batType;
+  }
+#endif
+
+#if !defined(SI3226X) && !defined(SI3228X)
+  SILABS_UNREFERENCED_PARAMETER(hProslic);
+#endif
+  return BO_DCDC_UNKNOWN;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_PowerDownConverter (proslicChanType_ptr pProslic)
+{
+  errorCodeType error = RC_NONE;
+  int32 vbat;
+  int timer = 0;
+
+  TRACEPRINT(pProslic, "\n", NULL);
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+  /* Force channel out of powersavings mode and then put it in open state */
+  WriteReg(pProslic,pProslic->channel,PROSLIC_REG_LINEFEED,LF_FWD_OHT);
+  Delay(pProTimer,10);
+  WriteReg(pProslic,pProslic->channel,PROSLIC_REG_LINEFEED, LF_OPEN);
+  Delay(pProTimer,50);
+
+  /* Don't try to shutdown converter if we're using external supplies or if the
+     converter is already shutdown.
+  */
+  if((ProSLIC_GetBatType(pProslic) == BO_DCDC_EXTERNAL) ||
+      (ReadRAM(pProslic,pProslic->channel,PROSLIC_RAM_PD_DCDC) & 0x100000) )
+  {
+    return RC_NONE;
+  }
+
+  WriteRAM(pProslic,pProslic->channel,PROSLIC_RAM_PD_DCDC,0x900000L);
+  Delay(pProTimer,50);
+
+  do
+  {
+    vbat = ReadRAM(pProslic, pProslic->channel, PROSLIC_RAM_MADC_VBAT);
+    if(vbat & 0x10000000L)
+    {
+      vbat |= 0xF0000000L;
+    }
+    Delay(pProTimer,10);
+  }
+  while((vbat > COMP_5V) && (timer++ < PROSLIC_TIMEOUT_DCDC_DOWN));
+
+  DEBUG_PRINT(pProslic, "%s VBAT Down = %d.%d v\n", LOGPRINT_PREFIX,
+              (int)((vbat/SCALE_V_MADC)/1000),
+              SIVOICE_ABS(((vbat/SCALE_V_MADC) - (vbat/SCALE_V_MADC)/1000*1000)));
+
+  if(timer > PROSLIC_TIMEOUT_DCDC_DOWN)
+  {
+    /* Error handling - shutdown converter, disable channel, set error tag */
+    pProslic->channelEnable = 0;
+    pProslic->error = error = RC_VBAT_DOWN_TIMEOUT;
+    DEBUG_PRINT(pProslic, "%sDCDC Power Down timeout channel %d\n", LOGPRINT_PREFIX,
+                pProslic->channel);
+  }
+  return error;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_LBCal (proslicChanType_ptr *pProslic, int size)
+{
+  int k;
+  int timeout;
+  uInt8 data;
+  uInt8 lfState, enhance_value;
+  TRACEPRINT(*pProslic, "size = %d\n", size);
+
+  if((*pProslic)->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+  /* For all channels, save settings, initiate LBCAL */
+  for(k = 0; k < size; k++)
+  {
+    if( (pProslic[k]->channelEnable) && (pProslic[k]->channelType == PROSLIC) )
+    {
+      DEBUG_PRINT(pProslic[k], "%sStarting LB Cal on channel %d\n", LOGPRINT_PREFIX,
+                  pProslic[k]->channel);
+      /* Preserve old settings */
+      lfState = ReadReg(pProslic[k], pProslic[k]->channel, PROSLIC_REG_LINEFEED);
+      enhance_value = ReadReg(pProslic[k], pProslic[k]->channel, PROSLIC_REG_ENHANCE);
+      ProSLIC_SetPowersaveMode(pProslic[k], PWRSAVE_DISABLE);
+      ProSLIC_SetLinefeedStatus(pProslic[k], LF_FWD_ACTIVE);
+      WriteReg(pProslic[k], pProslic[k]->channel, PROSLIC_REG_CALR0, CAL_LB_ALL);
+      WriteReg(pProslic[k], pProslic[k]->channel, PROSLIC_REG_CALR3,  0x80);
+      pProslic[k]->error = RC_CAL_TIMEOUT; /* Assume failure */
+
+      timeout = 0;
+      do
+      {
+        data = ReadReg(pProslic[k], pProslic[k]->channel, PROSLIC_REG_CALR3);
+        DelayX(*pProslic, 10);
+        timeout++;
+      }
+      while((data & 0x80) && (timeout < TIMEOUT_LB_CAL));
+
+      if( (data & 0x80) )
+      {
+        DEBUG_PRINT(pProslic[k], "%sLB Cal timeout on channel %d\n", LOGPRINT_PREFIX,
+                    pProslic[k]->channel);
+        WriteReg(pProslic[k], pProslic[k]->channel, PROSLIC_REG_LINEFEED, LF_OPEN);
+        return RC_CAL_TIMEOUT;
+      }
+      else
+      {
+        WriteReg(pProslic[k], pProslic[k]->channel, PROSLIC_REG_LINEFEED, lfState);
+        WriteReg(pProslic[k], pProslic[k]->channel, PROSLIC_REG_ENHANCE, enhance_value);
+        pProslic[k]->error = RC_NONE;
+      }
+    }
+  }
+  return RC_NONE;
+}
+
+/*****************************************************************************************************/
+#define PROSLIC_RAM_CMDAC_FWD 1476
+#define PROSLIC_RAM_CMDAC_REV 1477
+#define PROSLIC_RAM_CAL_TRNRD_DACT 1458
+#define PROSLIC_RAM_CAL_TRNRD_DACR 1459
+
+int ProSLIC_GetLBCalResult (proslicChanType *pProslic,int32 *result1,
+                            int32 *result2, int32 *result3, int32 *result4)
+{
+  TRACEPRINT(pProslic, "\n", NULL);
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+  *result1 = ReadRAM(pProslic, pProslic->channel, PROSLIC_RAM_CMDAC_FWD);
+  *result2 = ReadRAM(pProslic, pProslic->channel, PROSLIC_RAM_CMDAC_REV);
+  *result3 = ReadRAM(pProslic, pProslic->channel, PROSLIC_RAM_CAL_TRNRD_DACT);
+  *result4 = ReadRAM(pProslic, pProslic->channel, PROSLIC_RAM_CAL_TRNRD_DACR);
+
+  return RC_NONE;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_GetLBCalResultPacked (proslicChanType *pProslic,int32 *result)
+{
+  int32 results[4];
+  int rc;
+  TRACEPRINT(pProslic, "\n", NULL);
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+  rc = ProSLIC_GetLBCalResult(pProslic, &(results[0]), &(results[1]),
+                             &(results[2]), &(results[3]));
+  if(rc == RC_NONE)
+  {
+    /*
+      Bits 31:24   CMDAC_FWD[25:18]
+      Bits 23:16   CMDAC_REV[25:18]
+      Bits 15:8    CAL_TRNRD_DACT[20:13]
+      Bits 7:0     CAL_TRNRD_DACR[20:13]
+    */
+    *result = (results[0]<<6) & 0xff000000L;
+    *result |=(results[1]>>1) & 0x00ff0000L;
+    *result |=(results[2]>>5) & 0x0000ff00L;
+    *result |=(results[3]>>13)& 0x000000ffL;
+  }
+
+  return rc;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_LoadPreviousLBCal (proslicChanType *pProslic,int32 result1,
+                               int32 result2,int32 result3,int32 result4)
+{
+  TRACEPRINT(pProslic, "\n", NULL);
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+  WriteRAM(pProslic,pProslic->channel,PROSLIC_RAM_CMDAC_FWD,result1);
+  WriteRAM(pProslic,pProslic->channel,PROSLIC_RAM_CMDAC_REV,result2);
+  WriteRAM(pProslic,pProslic->channel,PROSLIC_RAM_CAL_TRNRD_DACT,result3);
+  WriteRAM(pProslic,pProslic->channel,PROSLIC_RAM_CAL_TRNRD_DACR,result4);
+
+#ifdef API_TEST
+  ramVal = ReadRAM(pProslic,pProslic->channel,PROSLIC_RAM_CMDAC_FWD);
+  LOGPRINT ("%s UNPACKED CMDAC_FWD = %08x\n", LOGPRINT_PREFIX, ramVal);
+  ramVal = ReadRAM(pProslic, pProslic->channel,PROSLIC_RAM_CMDAC_REV);
+  LOGPRINT ("%s UNPACKED CMDAC_REF = %08x\n", LOGPRINT_PREFIX, ramVal);
+  ramVal = ReadRAM(pProslic,pProslic->channel,PROSLIC_RAM_CAL_TRNRD_DACT);
+  LOGPRINT ("%s UNPACKED CAL_TRNRD_DACT = %08x\n", LOGPRINT_PREFIX, ramVal);
+  ramVal = ReadRAM(pProslic,pProslic->channel,PROSLIC_RAM_CAL_TRNRD_DACR);
+  LOGPRINT ("%s UNPACKED CAL_TRNRD_DACR = %08x\n", LOGPRINT_PREFIX, ramVal);
+#endif
+
+  return RC_NONE;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_LoadPreviousLBCalPacked (proslicChanType *pProslic,int32 *result)
+{
+  ramData ramVal[4];
+  TRACEPRINT(pProslic, "\n", NULL);
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+  ramVal[0] = (*result&0xff000000L)>>6;
+  ramVal[1] = (*result&0x00ff0000L)<<1;
+  ramVal[2] = (*result&0x0000ff00L)<<5;
+  ramVal[3] = (*result&0x000000ffL)<<13;
+
+  return ProSLIC_LoadPreviousLBCal(pProslic, ramVal[0], ramVal[1], ramVal[2],
+                                   ramVal[3]);
+}
+
+/*****************************************************************************************************/
+int ProSLIC_dbgSetDCFeedVopen (proslicChanType *pProslic, uInt32 v_vlim_val,
+                               int32 preset)
+{
+  TRACEPRINT(pProslic, "v_vlim_val = %u preset = %d\n", v_vlim_val, preset);
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+#ifdef SI3217X
+  if (pProslic->deviceId->chipType >= SI32171
+      && pProslic->deviceId->chipType <= SI32179)
+  {
+    return Si3217x_dbgSetDCFeedVopen (pProslic,v_vlim_val,preset);
+  }
+#endif
+
+#ifdef SI3218X
+  if (pProslic->deviceId->chipType >= SI32180
+      && pProslic->deviceId->chipType <= SI32189)
+  {
+    return Si3218x_dbgSetDCFeedVopen (pProslic,v_vlim_val,preset);
+  }
+#endif
+
+#ifdef SI3219X
+  if ( IS_SI3219X(pProslic->deviceId) )
+  {
+    return Si3219x_dbgSetDCFeedVopen (pProslic,v_vlim_val,preset);
+  }
+#endif
+
+#ifdef SI3226X
+  if (pProslic->deviceId->chipType >= SI32260
+      && pProslic->deviceId->chipType <= SI32269)
+  {
+    return Si3226x_dbgSetDCFeedVopen (pProslic,v_vlim_val,preset);
+  }
+#endif
+
+#ifdef SI3228X
+  if (pProslic->deviceId->chipType >= SI32280
+      && pProslic->deviceId->chipType <= SI32289)
+  {
+    return Si3228x_dbgSetDCFeedVopen (pProslic,v_vlim_val,preset);
+  }
+#endif
+
+  return RC_COMPLETE_NO_ERR;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_dbgSetDCFeedIloop (proslicChanType *pProslic, uInt32 i_ilim_val,
+                               int32 preset)
+{
+  TRACEPRINT(pProslic, "i_ilim_val = %u preset = %d\n", i_ilim_val, preset);
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+#ifdef SI3217X
+  if (pProslic->deviceId->chipType >= SI32171
+      && pProslic->deviceId->chipType <= SI32179)
+  {
+    return Si3217x_dbgSetDCFeedIloop (pProslic,i_ilim_val,preset);
+  }
+#endif
+
+#ifdef SI3218X
+  if (pProslic->deviceId->chipType >= SI32180
+      && pProslic->deviceId->chipType <= SI32189)
+  {
+    return Si3218x_dbgSetDCFeedIloop (pProslic,i_ilim_val,preset);
+  }
+#endif
+
+#ifdef SI3219X
+  if ( IS_SI3219X(pProslic->deviceId) )
+  {
+    return Si3219x_dbgSetDCFeedIloop (pProslic,i_ilim_val,preset);
+  }
+#endif
+
+#ifdef SI3226X
+  if (pProslic->deviceId->chipType >= SI32260
+      && pProslic->deviceId->chipType <= SI32269)
+  {
+    return Si3226x_dbgSetDCFeedIloop (pProslic,i_ilim_val,preset);
+  }
+#endif
+
+#ifdef SI3228X
+  if (pProslic->deviceId->chipType >= SI32280
+      && pProslic->deviceId->chipType <= SI32289)
+  {
+    return Si3228x_dbgSetDCFeedIloop (pProslic,i_ilim_val,preset);
+  }
+#endif
+
+  return RC_COMPLETE_NO_ERR;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_dbgSetRinging (proslicChanType *pProslic,
+                           ProSLIC_dbgRingCfg *ringCfg, int preset)
+{
+  TRACEPRINT(pProslic, "preset = %d\n", preset);
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+#ifdef SI3217X
+  if (pProslic->deviceId->chipType >= SI32171
+      && pProslic->deviceId->chipType <= SI32179)
+  {
+    return Si3217x_dbgSetRinging (pProslic,ringCfg,preset);
+  }
+#endif
+
+#ifdef SI3218X
+  if (pProslic->deviceId->chipType >= SI32180
+      && pProslic->deviceId->chipType <= SI32189)
+  {
+    return Si3218x_dbgSetRinging (pProslic,ringCfg,preset);
+  }
+#endif
+
+#ifdef SI3219X
+  if ( IS_SI3219X(pProslic->deviceId) )
+  {
+    return Si3219x_dbgSetRinging (pProslic,ringCfg,preset);
+  }
+#endif
+
+#ifdef SI3226X
+  if (pProslic->deviceId->chipType >= SI32260
+      && pProslic->deviceId->chipType <= SI32269)
+  {
+    return Si3226x_dbgSetRinging (pProslic,ringCfg,preset);
+  }
+#endif
+
+#ifdef SI3228X
+  if (pProslic->deviceId->chipType >= SI32280
+      && pProslic->deviceId->chipType <= SI32289)
+  {
+    return Si3228x_dbgSetRinging (pProslic,ringCfg,preset);
+  }
+#endif
+
+  return RC_COMPLETE_NO_ERR;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_dbgSetRXGain (proslicChanType *pProslic, int32 gain,
+                          int impedance_preset, int audio_gain_preset)
+{
+  TRACEPRINT(pProslic, "gain = %d imp_preset = %d audio_gain_preset = %d\n", gain,
+             impedance_preset, audio_gain_preset);
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+#ifdef SI3217X
+  if (pProslic->deviceId->chipType >= SI32171
+      && pProslic->deviceId->chipType <= SI32179)
+  {
+    return Si3217x_dbgSetRXGain (pProslic,gain,impedance_preset,audio_gain_preset);
+  }
+#endif
+
+#ifdef SI3218X
+  if (pProslic->deviceId->chipType >= SI32180
+      && pProslic->deviceId->chipType <= SI32189)
+  {
+    return Si3218x_dbgSetRXGain (pProslic,gain,impedance_preset,audio_gain_preset);
+  }
+#endif
+
+#ifdef SI3219X
+  if ( IS_SI3219X(pProslic->deviceId) )
+  {
+    return Si3219x_dbgSetRXGain (pProslic,gain,impedance_preset,audio_gain_preset);
+  }
+#endif
+
+#ifdef SI3226X
+  if (pProslic->deviceId->chipType >= SI32260
+      && pProslic->deviceId->chipType <= SI32269)
+  {
+    return Si3226x_dbgSetRXGain (pProslic,gain,impedance_preset,audio_gain_preset);
+  }
+#endif
+
+#ifdef SI3228X
+  if (pProslic->deviceId->chipType >= SI32280
+      && pProslic->deviceId->chipType <= SI32289)
+  {
+    return Si3228x_dbgSetRXGain (pProslic,gain,impedance_preset,audio_gain_preset);
+  }
+#endif
+
+  return RC_COMPLETE_NO_ERR;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_dbgSetTXGain (proslicChanType *pProslic, int32 gain,
+                          int impedance_preset, int audio_gain_preset)
+{
+  TRACEPRINT(pProslic, "gain = %d imp_preset = %d audio_gain_preset = %d\n", gain,
+             impedance_preset, audio_gain_preset);
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+#ifdef SI3217X
+  if (pProslic->deviceId->chipType >= SI32171
+      && pProslic->deviceId->chipType <= SI32179)
+  {
+    return Si3217x_dbgSetTXGain (pProslic,gain,impedance_preset,audio_gain_preset);
+  }
+#endif
+
+#ifdef SI3218X
+  if (pProslic->deviceId->chipType >= SI32180
+      && pProslic->deviceId->chipType <= SI32189)
+  {
+    return Si3218x_dbgSetTXGain (pProslic,gain,impedance_preset,audio_gain_preset);
+  }
+#endif
+
+#ifdef SI3219X
+  if ( IS_SI3219X(pProslic->deviceId) )
+  {
+    return Si3219x_dbgSetTXGain (pProslic,gain,impedance_preset,audio_gain_preset);
+  }
+#endif
+
+#ifdef SI3226X
+  if (pProslic->deviceId->chipType >= SI32260
+      && pProslic->deviceId->chipType <= SI32269)
+  {
+    return Si3226x_dbgSetTXGain (pProslic,gain,impedance_preset,audio_gain_preset);
+  }
+#endif
+
+#ifdef SI3228X
+  if (pProslic->deviceId->chipType >= SI32280
+      && pProslic->deviceId->chipType <= SI32289)
+  {
+    return Si3228x_dbgSetTXGain (pProslic,gain,impedance_preset,audio_gain_preset);
+  }
+#endif
+
+  return RC_COMPLETE_NO_ERR;
+}
+
+/*****************************************************************************************************/
+/*
+** Function: ProSLIC_LineMonitor
+**
+** Description:
+** Generic monitoring function
+**
+** Returns:
+** 0
+*/
+
+int ProSLIC_LineMonitor (proslicChanType *pProslic, proslicMonitorType *monitor)
+{
+  TRACEPRINT(pProslic, "\n", NULL);
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+#ifdef SI3217X
+  if (pProslic->deviceId->chipType >= SI32171
+      && pProslic->deviceId->chipType <= SI32179)
+  {
+    return Si3217x_LineMonitor (pProslic, monitor);
+  }
+#endif
+
+#ifdef SI3218X
+  if (pProslic->deviceId->chipType >= SI32180
+      && pProslic->deviceId->chipType <= SI32189)
+  {
+    return Si3218x_LineMonitor (pProslic, monitor);
+  }
+#endif
+
+#ifdef SI3219X
+  if ( IS_SI3219X(pProslic->deviceId) )
+  {
+    return Si3219x_LineMonitor (pProslic, monitor);
+  }
+#endif
+
+#ifdef SI3226X
+  if (pProslic->deviceId->chipType >= SI32260
+      && pProslic->deviceId->chipType <= SI32269)
+  {
+    return Si3226x_LineMonitor (pProslic, monitor);
+  }
+#endif
+
+#ifdef SI3228X
+  if (pProslic->deviceId->chipType >= SI32280
+      && pProslic->deviceId->chipType <= SI32289)
+  {
+    return Si3228x_LineMonitor (pProslic, monitor);
+  }
+#endif
+
+  return RC_COMPLETE_NO_ERR;
+}
+
+/*****************************************************************************************************/
+/*
+** Function: ProSLIC_PSTNCheck
+**
+** Description:
+** Monitor for excessive longitudinal current, which
+** would be present if a live pstn line was connected
+** to the port.
+**
+** Returns:
+** 0 - no pstn detected
+** 1 - pstn detected
+*/
+int ProSLIC_PSTNCheck (proslicChanType *pProslic,
+                       proslicPSTNCheckObjType *pPSTNCheck)
+{
+  TRACEPRINT(pProslic, "\n", NULL);
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+#ifdef SI3217X
+  if (pProslic->deviceId->chipType >= SI32171
+      && pProslic->deviceId->chipType <= SI32179)
+  {
+    return Si3217x_PSTNCheck (pProslic,pPSTNCheck);
+  }
+#endif
+
+#ifdef SI3218X
+  if (pProslic->deviceId->chipType >= SI32180
+      && pProslic->deviceId->chipType <= SI32189)
+  {
+    return Si3218x_PSTNCheck (pProslic,pPSTNCheck);
+  }
+#endif
+
+#ifdef SI3219X
+  if ( IS_SI3219X(pProslic->deviceId) )
+  {
+    return Si3219x_PSTNCheck (pProslic,pPSTNCheck);
+  }
+#endif
+
+#ifdef SI3226X
+  if (pProslic->deviceId->chipType >= SI32260
+      && pProslic->deviceId->chipType <= SI32269)
+  {
+    return Si3226x_PSTNCheck (pProslic,pPSTNCheck);
+  }
+#endif
+
+#ifdef SI3228X
+  if (pProslic->deviceId->chipType >= SI32280
+      && pProslic->deviceId->chipType <= SI32289)
+  {
+    return Si3228x_PSTNCheck (pProslic,pPSTNCheck);
+  }
+#endif
+
+  return RC_COMPLETE_NO_ERR;
+}
+
+/*****************************************************************************************************/
+/*
+** Function: ProSLIC_DiffPSTNCheck
+**
+** Description:
+** Monitor for excessive longitudinal current, which
+** would be present if a live pstn line was connected
+** to the port.
+**
+** Returns:
+** RC_NONE - test in progress
+** RC_IGNORE - non-ProSLIC channel
+** RC_COMPLETE_NO_ERR - ProSLIC does not support feature.
+** RC_PSTN_OPEN_FEMF | RC_COMPLETE_NO_ERR - test completed.
+**
+*/
+#ifdef PSTN_DET_ENABLE
+int ProSLIC_DiffPSTNCheck (proslicChanType *pProslic,
+                           proslicDiffPSTNCheckObjType *pPSTNCheck)
+{
+  TRACEPRINT(pProslic, "\n", NULL);
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+#ifdef SI3217X
+  if (pProslic->deviceId->chipType >= SI32171
+      && pProslic->deviceId->chipType <= SI32179)
+  {
+    return Si3217x_DiffPSTNCheck (pProslic,pPSTNCheck);
+  }
+#endif
+
+#ifdef SI3218X
+  if (pProslic->deviceId->chipType >= SI32180
+      && pProslic->deviceId->chipType <= SI32189)
+  {
+    return Si3218x_DiffPSTNCheck (pProslic,pPSTNCheck);
+  }
+#endif
+
+#ifdef SI3219X
+  if ( IS_SI3219X(pProslic->deviceId) )
+  {
+    return Si3219x_DiffPSTNCheck (pProslic,pPSTNCheck);
+  }
+#endif
+
+#ifdef SI3226X
+  if (pProslic->deviceId->chipType >= SI32260
+      && pProslic->deviceId->chipType <= SI32269)
+  {
+    return Si3226x_DiffPSTNCheck (pProslic,pPSTNCheck);
+  }
+#endif
+
+#ifdef SI3228X
+  if (pProslic->deviceId->chipType >= SI32280
+      && pProslic->deviceId->chipType <= SI32289)
+  {
+    return Si3228x_DiffPSTNCheck (pProslic,pPSTNCheck);
+  }
+#endif
+
+  return RC_COMPLETE_NO_ERR;
+}
+#endif
+
+/*****************************************************************************************************/
+/*
+** Function: ProSLIC_CreatePSTNCheckObj
+**
+** Description:
+** Allocate memory for pstnCheckObj
+**
+** Returns:
+** RC_NONE
+** RC_NO_MEM if failed to allocate memory.
+** RC_UNSUPPORTED_FEATER if malloc disabled
+*/
+int ProSLIC_CreatePSTNCheckObjs(proslicPSTNCheckObjType_ptr *pstnCheckObj,
+                                unsigned int num_objs)
+{
+  TRACEPRINT_NOCHAN("num_objs = %u\n", num_objs);
+#ifndef DISABLE_MALLOC
+  *pstnCheckObj = SIVOICE_CALLOC(sizeof(proslicPSTNCheckObjType),num_objs);
+  if(*pstnCheckObj == NULL)
+  {
+#ifdef ENABLE_DEBUG
+    LOGPRINT("%s: %s: failed to allocate memory", LOGPRINT_PREFIX, __FUNCTION__);
+#endif
+    return RC_NO_MEM;
+  }
+  return RC_NONE;
+#else
+  SILABS_UNREFERENCED_PARAMETER(pstnCheckObj);
+  SILABS_UNREFERENCED_PARAMETER(num_objs);
+  return RC_UNSUPPORTED_FEATURE;
+#endif
+}
+
+/*****************************************************************************************************/
+/*
+** Function: ProSLIC_CreateDiffPSTNCheckObjs
+**
+** Description:
+** Allocate memory for proslicDiffPstnCheckObjs
+**
+** Returns:
+** RC_NONE
+** RC_NO_MEM if failed to allocate memory.
+** RC_UNSUPPORTED_FEATURE if malloc disabled
+*/
+
+#ifdef PSTN_DET_ENABLE
+int ProSLIC_CreateDiffPSTNCheckObjs(proslicDiffPSTNCheckObjType_ptr
+                                    *pstnCheckObj, unsigned int num_objs)
+{
+  TRACEPRINT_NOCHAN("num_objs = %u\n", num_objs);
+
+#ifndef DISABLE_MALLOC
+  *pstnCheckObj = SIVOICE_CALLOC(sizeof(proslicDiffPSTNCheckObjType),num_objs);
+  if(*pstnCheckObj == NULL)
+  {
+#ifdef ENABLE_DEBUG
+    LOGPRINT("%s: %s: failed to allocate memory", LOGPRINT_PREFIX, __FUNCTION__);
+#endif
+    return RC_NO_MEM;
+  }
+  return RC_NONE;
+#else
+  SILABS_UNREFERENCED_PARAMETER(pstnCheckObj);
+  SILABS_UNREFERENCED_PARAMETER(num_objs);
+  return RC_UNSUPPORTED_FEATURE;
+#endif
+}
+#endif
+
+/*****************************************************************************************************/
+/*
+** Function: ProSLIC_DestroyPSTNCheckObjs
+**
+** Description:
+** Free memory for pstnCheckObj
+**
+** Returns:
+** RC_NONE
+** RC_UNSUPPORTED_FEATER if malloc disabled
+*/
+int ProSLIC_DestroyPSTNCheckObjs(proslicPSTNCheckObjType_ptr *pstnCheckObj)
+{
+  TRACEPRINT_NOCHAN("\n", NULL);
+
+#ifndef DISABLE_MALLOC
+  if(pstnCheckObj)
+  {
+    SIVOICE_FREE((proslicPSTNCheckObjType_ptr)*pstnCheckObj);
+  }
+
+  return RC_NONE;
+
+#else
+  SILABS_UNREFERENCED_PARAMETER(pstnCheckObj);
+  return RC_UNSUPPORTED_FEATURE;
+#endif
+}
+
+/*****************************************************************************************************/
+/*
+** Function: ProSLIC_DestroyDiffPSTNCheckObjs
+**
+** Description:
+** Free memory for pstnDiffCheckObj
+**
+** Returns:
+** RC_NONE
+** RC_UNSUPPORTED_FEATER if malloc disabled
+*/
+#ifdef PSTN_DET_ENABLE
+int ProSLIC_DestroyDiffPSTNCheckObjs(proslicDiffPSTNCheckObjType_ptr
+                                     *pstnCheckObj)
+{
+  TRACEPRINT_NOCHAN("\n", NULL);
+
+#ifndef DISABLE_MALLOC
+  if(pstnCheckObj)
+  {
+    SIVOICE_FREE((proslicDiffPSTNCheckObjType_ptr)*pstnCheckObj);
+  }
+  return RC_NONE;
+#else
+  SILABS_UNREFERENCED_PARAMETER(pstnCheckObj);
+  return RC_UNSUPPORTED_FEATURE;
+#endif
+}
+#endif
+
+/*****************************************************************************************************/
+/*
+** Function: ProSLIC_InitPSTNCheckObj
+**
+** Description:
+** Initialize pstnCheckObj structure members
+**
+** Returns:
+** RC_NONE
+*/
+int ProSLIC_InitPSTNCheckObj(proslicPSTNCheckObjType_ptr pstnCheckObj,
+                             int32 avgThresh, int32 singleThresh, uInt8 samples)
+{
+  TRACEPRINT_NOCHAN("avgThres = %d singleThresh = %d samples = %u\n", avgThresh,
+                    avgThresh, samples);
+
+  pstnCheckObj->avgThresh = avgThresh;
+  pstnCheckObj->singleThresh = singleThresh;
+  pstnCheckObj->samples = samples;
+  pstnCheckObj->avgIlong = 0;
+  pstnCheckObj->count = 0;
+  pstnCheckObj->buffFull = 0;
+
+  return RC_NONE;
+}
+
+/*****************************************************************************************************/
+/*
+** Function: ProSLIC_InitDiffPSTNCheckObj
+**
+** Description:
+** Initialize pstnCheckObj structure members
+**
+** Returns:
+** RC_NONE
+*/
+#ifdef PSTN_DET_ENABLE
+int ProSLIC_InitDiffPSTNCheckObj(proslicDiffPSTNCheckObjType_ptr
+                                 pstnDiffCheckObj,
+                                 int preset1,
+                                 int preset2,
+                                 int entry_preset,
+                                 int femf_enable)
+{
+  TRACEPRINT_NOCHAN("p1 = %d p2 = %d ep = %d femf_enable = %d\n", preset1,
+                    preset2, entry_preset, femf_enable);
+
+  pstnDiffCheckObj->samples = PSTN_DET_DIFF_SAMPLES;
+  pstnDiffCheckObj->max_femf_vopen = PSTN_DET_MAX_FEMF;
+  pstnDiffCheckObj->entryDCFeedPreset = entry_preset;
+  pstnDiffCheckObj->dcfPreset1 = preset1;
+  pstnDiffCheckObj->dcfPreset2 = preset2;
+  pstnDiffCheckObj->femf_enable = femf_enable;
+  pstnDiffCheckObj->pState.stage = 0;
+  pstnDiffCheckObj->pState.sampleIterations = 0;
+  pstnDiffCheckObj->pState.waitIterations = 0;
+
+  return RC_NONE;
+}
+#endif
+
+/*****************************************************************************************************/
+/*
+** Function: ProSLIC_SetPwrsaveMode
+**
+** Description:
+** Enable or disable powersave mode
+**
+** Returns:
+** RC_NONE
+*/
+#define PROSLIC_REG_ENHANCE 47
+
+int ProSLIC_SetPowersaveMode (proslicChanType *pProslic, int pwrsave)
+{
+  uInt8 regData;
+  TRACEPRINT(pProslic, "pwrsave = %d\n", pwrsave);
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+  regData = ReadReg(pProslic,pProslic->channel, PROSLIC_REG_ENHANCE);
+
+  if(pwrsave == PWRSAVE_DISABLE)
+  {
+#ifdef SI3217X
+    if (pProslic->deviceId->chipType >= SI32171
+        && pProslic->deviceId->chipType <= SI32179)
+    {
+      regData &= 0x27;
+    }
+    else
+    {
+#endif
+      regData &= 0x07;
+#ifdef SI3217X
+    }
+#endif
+  }
+  else
+  {
+    regData |= 0x10;
+  }
+
+  return WriteReg(pProslic,pProslic->channel, PROSLIC_REG_ENHANCE, regData);
+}
+
+/*****************************************************************************************************/
+/*
+** Function: ProSLIC_SetDAAEnable
+**
+** Description:
+** Enable or disable adjacent FXO (Si32178 only)
+**
+** Returns:
+** RC_NONE
+*/
+int ProSLIC_SetDAAEnable (proslicChanType *pProslic, int enable)
+{
+  TRACEPRINT(pProslic, "\n", NULL);
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+#ifdef SI3217X
+  return Si3217x_SetDAAEnable (pProslic,enable);
+#else
+  SILABS_UNREFERENCED_PARAMETER(enable);
+  return RC_NONE;
+#endif
+}
+
+/*****************************************************************************************************/
+/*
+** Function: ProSLIC_SetUserMode
+**
+** Description: Enables User Access Mode (UAM) if the part supports it.
+**
+** Returns:
+** RC_NONE if successful.
+*/
+#define PROSLIC_REG_USERMODE_ENABLE 126
+
+int ProSLIC_SetUserMode(proslicChanType *pProslic,BOOLEAN isEnabled,
+                        BOOLEAN isBcast)
+{
+  uInt8 data;
+  uInt8 channel;
+
+  TRACEPRINT(pProslic, "enable = %d bcast = %d\n", (int)isEnabled, (int)isBcast);
+
+  if(isEnabled == FALSE)
+  {
+    return RC_NONE;
+  }
+
+  if( pProslic->channelType != PROSLIC )
+  {
+    return RC_UNSUPPORTED_FEATURE;
+  }
+
+  if(isBcast == TRUE)
+  {
+    channel = PROSLIC_CHAN_BROADCAST;
+  }
+  else
+  {
+    channel = pProslic->channel;
+  }
+
+  data = ReadReg(pProslic,pProslic->channel,
+                 PROSLIC_REG_USERMODE_ENABLE); /*we check first channel. we assume all channels same user mode state for broadcast */
+
+  if (((data&1) != 0) == isEnabled)
+  {
+    return RC_NONE;
+  }
+
+  WriteReg(pProslic,channel,PROSLIC_REG_USERMODE_ENABLE,2);
+  WriteReg(pProslic,channel,PROSLIC_REG_USERMODE_ENABLE,8);
+  WriteReg(pProslic,channel,PROSLIC_REG_USERMODE_ENABLE,0xe);
+  return WriteReg(pProslic,channel,PROSLIC_REG_USERMODE_ENABLE,0);
+}
+
+/*****************************************************************************************************/
+/*
+** Function: ProSLIC_isReinitRequired
+**
+** Description:
+** Checks for improper ring exit
+**
+** Returns:
+** RC_NONE                -  Reinit not required
+** RC_REINIT_REQUIRED     -  Corrupted state machine - reinit required
+**
+*/
+
+int ProSLIC_isReinitRequired(proslicChanType *pProslic)
+{
+  uInt8 lf;
+  ramData rkdc_sum;
+  TRACEPRINT(pProslic, "\n", NULL);
+
+  if( pProslic->channelType != PROSLIC)
+  {
+    return RC_IGNORE;
+  }
+
+  /* Check for improper ring exit which may cause dcfeed corruption */
+
+  lf = ReadReg(pProslic, pProslic->channel,PROSLIC_REG_LINEFEED);
+  rkdc_sum = ReadRAM(pProslic,pProslic->channel,PROSLIC_RAM_RDC_SUM);
+  DEBUG_PRINT(pProslic, "%sisReinitRequired: Linefeed = 0x%02X RDC_SUM = %d\n",
+              LOGPRINT_PREFIX, (int)lf, (int) rkdc_sum);
+  if((rkdc_sum & 0x400000)&&(lf != 0x44))
+  {
+    return RC_REINIT_REQUIRED;
+  }
+  else
+  {
+    return RC_NONE;
+  }
+}
+
+/*****************************************************************************************************/
+/*
+** Function: LoadRegTable
+**
+** Description:
+** Generic function to load register/RAM with predefined addr/value
+*/
+int ProSLIC_LoadRegTable (proslicChanType *pProslic, 
+                          const ProslicRAMInit *pRamTable,
+                          const ProslicRegInit *pRegTable, 
+                          int broadcast)
+{
+  uInt16 i;
+  uInt8 channel;
+
+  TRACEPRINT(pProslic, "bcast = %d\n", broadcast);
+  /* DAA doesn't have a RAM table.. skip it... */
+  if( (pRamTable != 0)
+      && (pProslic->channelType != PROSLIC) )
+  {
+    return RC_IGNORE;
+  }
+
+  if (broadcast)
+  {
+    channel = PROSLIC_CHAN_BROADCAST;
+  }
+  else
+  {
+    channel = pProslic->channel;
+  }
+
+  i=0;
+  if (pRamTable != 0)
+  {
+    while (pRamTable[i].address != 0xffff)
+    {
+      WriteRAM(pProslic,channel,pRamTable[i].address,pRamTable[i].initValue);
+      i++;
+    }
+  }
+  i=0;
+  if (pRegTable != 0)
+  {
+    while (pRegTable[i].address != 0xff)
+    {
+      WriteReg(pProslic,channel,pRegTable[i].address,pRegTable[i].initValue);
+      i++;
+    }
+  }
+
+  return RC_NONE;
+}
+
+/*****************************************************************************************************/
+/*
+** Function: LoadRegTables
+**
+** Description:
+** Generic function to load register/RAM with predefined addr/value
+*/
+
+int ProSLIC_LoadRegTables(proslicChanType_ptr *pProslic,
+                          const ProslicRAMInit *pRamTable, const ProslicRegInit *pRegTable, int size)
+{
+  int i;
+  TRACEPRINT(*pProslic, "size = %d\n", size);
+  for (i=0; i<size; i++)
+  {
+    if (pProslic[i]->channelEnable)
+    {
+      ProSLIC_LoadRegTable(pProslic[i],pRamTable,pRegTable,FALSE);
+    }
+  }
+  return RC_NONE;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_UnsupportedFeatureNoArg(proslicChanType_ptr pProslic,
+                                    const char *function_name)
+{
+#ifdef ENABLE_DEBUG
+  LOGPRINT("%s: unsupported %s was called on channel %d\n", LOGPRINT_PREFIX,
+           function_name, pProslic->channel);
+#else
+  SILABS_UNREFERENCED_PARAMETER(pProslic);
+  SILABS_UNREFERENCED_PARAMETER(function_name);
+#endif
+  return RC_UNSUPPORTED_FEATURE;
+}
+
+/*****************************************************************************************************/
+/*
+** Function: ProSLIC_PSTN_delay_poll
+**
+** Description:
+** Delay function called within PSTN detection functions
+**
+** Return Value:
+** none
+*/
+#ifdef PSTN_DET_ENABLE
+void ProSLIC_PSTN_delay_poll(proslicTestStateType *pState, uInt16 delay)
+{
+  uInt16 delayCount;
+
+  if((delay/PSTN_DET_POLL_RATE) < 2)
+  {
+    delayCount = 0;
+  }
+  else
+  {
+    delayCount = (delay/PSTN_DET_POLL_RATE) - 2;
+  }
+
+  pState->waitIterations++;
+  if((pState->waitIterations == delayCount) || (delayCount == 0))
+  {
+    pState->waitIterations = 0;
+    pState->stage++;
+  }
+}
+#endif
+
+/*****************************************************************************************************/
+/*
+** Function: ProSLIC_Calibrate
+**
+** Description:
+** Performs calibration based on passed ptr to array of
+** desired CALRn settings.
+**
+** Starts calibration on all channels sequentially (not broadcast)
+** and continuously polls for completion.  Return error code if
+** CAL_EN does not clear for each enabled channel within the passed
+** timeout period.
+*/
+int ProSLIC_Calibrate(proslicChanType_ptr *pProslic, int maxChan, uInt8 *calr,
+                      int maxTime)
+{
+  int i,j, cal_en;
+  int cal_en_chan = 0;
+  int timer = 0;
+
+  TRACEPRINT(*pProslic, "maxChan = %d time = %d\n", maxChan, maxTime );
+
+  if ((*pProslic)->channelType != PROSLIC)
+  {
+    return RC_CHANNEL_TYPE_ERR;
+  }
+
+  for(i = 0; i < maxChan; i++)
+  {
+    if((pProslic[i]->channelEnable)&&(pProslic[i]->channelType == PROSLIC))
+    {
+      for(j = 0; j < 4; j++)
+      {
+        WriteReg(pProslic[i], pProslic[i]->channel, (PROSLIC_REG_CALR0+j), calr[j]);
+      }
+    }
+  }
+
+  /* Wait for calibration to complete */
+  do
+  {
+    cal_en = 0;
+    DelayX(*pProslic, 10);
+    for(i = 0; i < maxChan; i++)
+    {
+      if( (pProslic[i]->channelEnable) && (pProslic[i]->channelType == PROSLIC))
+      {
+        cal_en_chan = ReadReg(pProslic[i], pProslic[i]->channel, PROSLIC_REG_CALR3);
+        if( (cal_en_chan & 0x80) && (timer == maxTime) )
+        {
+          DEBUG_PRINT(pProslic[i], "%sCalibration timed out on channel %d\n",
+                      LOGPRINT_PREFIX, pProslic[i]->channel);
+          pProslic[i]->channelEnable = 0;
+          pProslic[i]->error = RC_CAL_TIMEOUT;
+        }
+        cal_en |= cal_en_chan;
+      }
+    }
+  }
+  while( (timer++ <= maxTime) && (cal_en & 0x80) );
+
+  if(timer <= maxTime)
+  {
+    return RC_NONE;
+  }
+  else
+  {
+    return RC_CAL_TIMEOUT;
+  }
+}
+/*****************************************************************************************************/
+/* This function is used by the xxxx_Init_with_Options - do not call this directly... */
+int ProSLIC_ReInit_helper(proslicChanType_ptr *pProslic, int size,
+                          initOptionsType init_option, int numChanPerDevice)
+{
+  int i;
+
+  /* Preserve linefeed state.. */
+  for(i = 0; i < size; i++)
+  {
+    pProslic[i]->scratch = ReadReg( pProslic[i], pProslic[i]->channel,
+                                   PROSLIC_REG_LINEFEED);
+    ProSLIC_PowerDownConverter( pProslic[i] );
+
+    /* Clear MSTRSTAT on a device basis */
+    if( (numChanPerDevice == 1) 
+      || ((numChanPerDevice == 2) && ((i&1) == 0)  ) )
+    {
+      ProSLIC_WriteReg(pProslic[i], PROSLIC_REG_MSTRSTAT, 0xFF); /* Clear master status register */
+    }
+  }
+
+  DelayX(*pProslic, 10); /* Wait to ensure system is powered down... */
+
+  /* Do a soft reset if reinit is requested...*/
+  if(init_option == INIT_REINIT)
+  {
+    for(i = 0; i < size; i++)
+    {
+      if(numChanPerDevice == 2) 
+      {
+        WriteReg(pProslic[i], (pProslic[i])->channel, PROSLIC_REG_RESET,
+                 (((pProslic[i])->channel)&1)+1); /* reset 1 channel at a time */
+      }
+      else
+      {
+        WriteReg(pProslic[i], (pProslic[i])->channel, PROSLIC_REG_RESET, 1);
+      }
+
+      pProslic[i]->error = RC_NONE; /* Clear any errors we may have seen in powering down the converter */
+    }
+    DelayX(*pProslic, 100); /* Wait for a soft reset */
+
+  }
+  return RC_NONE;
+}
+
+/*****************************************************************************************************/
+int ProSLIC_SoftReset(proslicChanType_ptr pProslic, uInt16 resetOptions)
+{
+  uInt8 data;
+
+  TRACEPRINT(pProslic, "reset option: %d\n",resetOptions);
+
+  /* We can't use channelType since it may not been set.  We assume at least 
+   * SWInit was called... */
+  if( pProslic->deviceId->chipType == SI3050 )
+  {
+    return RC_CHANNEL_TYPE_ERR;
+  }
+
+  /* Check if we're in free-run mode, if so abort */
+  data = ReadReg(pProslic, pProslic->channel, PROSLIC_REG_ENHANCE);
+
+  if(data & 0x6)
+  {
+    return RC_PLL_FREERUN_ACTIVE;
+  }
+
+  if(resetOptions & PROSLIC_BCAST_RESET)
+  {
+    return WriteReg(pProslic, PROSLIC_CHAN_BROADCAST, PROSLIC_REG_RESET, (uInt8)(resetOptions & 0xFF));
+  }
+  else
+  {
+    return WriteReg(pProslic, pProslic->channel, PROSLIC_REG_RESET, (uInt8)(resetOptions & 0xFF));
+  }
+}
+
+/*****************************************************************************************************/
+#ifndef DISABLE_TONE_SETUP
+int ProSLIC_ToneGenSetupPtr(proslicChanType_ptr pProslic, ProSLIC_Tone_Cfg *cfg)
+{
+  TRACEPRINT(pProslic, "\n",NULL);
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_CHANNEL_TYPE_ERR;
+  }
+
+  WriteRAM(pProslic, pProslic->channel,PROSLIC_RAM_OSC1FREQ, cfg->osc1.freq);
+  WriteRAM(pProslic, pProslic->channel,PROSLIC_RAM_OSC1AMP, cfg->osc1.amp);
+  WriteRAM(pProslic, pProslic->channel,PROSLIC_RAM_OSC1PHAS, cfg->osc1.phas);
+  WriteReg(pProslic, pProslic->channel,PROSLIC_REG_O1TAHI,cfg->osc1.tahi);
+  WriteReg(pProslic, pProslic->channel,PROSLIC_REG_O1TALO,cfg->osc1.talo);
+  WriteReg(pProslic, pProslic->channel,PROSLIC_REG_O1TIHI,cfg->osc1.tihi);
+  WriteReg(pProslic, pProslic->channel,PROSLIC_REG_O1TILO,cfg->osc1.tilo);
+
+  WriteRAM(pProslic, pProslic->channel,PROSLIC_RAM_OSC2FREQ, cfg->osc2.freq);
+  WriteRAM(pProslic, pProslic->channel,PROSLIC_RAM_OSC2AMP, cfg->osc2.amp);
+  WriteRAM(pProslic, pProslic->channel,PROSLIC_RAM_OSC2PHAS, cfg->osc2.phas);
+  WriteReg(pProslic, pProslic->channel,PROSLIC_REG_O2TAHI,cfg->osc2.tahi);
+  WriteReg(pProslic, pProslic->channel,PROSLIC_REG_O2TALO,cfg->osc2.talo);
+  WriteReg(pProslic, pProslic->channel,PROSLIC_REG_O2TIHI,cfg->osc2.tihi);
+  WriteReg(pProslic, pProslic->channel,PROSLIC_REG_O2TILO,cfg->osc2.tilo);
+
+
+  WriteReg(pProslic, pProslic->channel,PROSLIC_REG_OMODE,cfg->omode);
+  return RC_NONE;
+}
+#endif /* DISABLE_TONE_SETUP */
+
+/*****************************************************************************************************/
+#ifndef DISABLE_FSK_SETUP
+int ProSLIC_FSKSetupPtr (proslicChanType_ptr pProslic, ProSLIC_FSK_Cfg *cfg)
+{
+  uInt8 data;
+  int i;
+
+  TRACEPRINT(pProslic, "\n",NULL);
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_CHANNEL_TYPE_ERR;
+  }
+
+  WriteReg(pProslic,pProslic->channel,PROSLIC_REG_FSKDEPTH,
+           0x08); /* Clear Buffer */
+  WriteReg(pProslic,pProslic->channel,PROSLIC_REG_O1TAHI,0);
+  WriteReg(pProslic,pProslic->channel,PROSLIC_REG_O1TIHI,0);
+  WriteReg(pProslic,pProslic->channel,PROSLIC_REG_O1TILO,0);
+  WriteReg(pProslic,pProslic->channel,PROSLIC_REG_O1TALO,0x13);
+
+  data = ReadReg(pProslic,pProslic->channel,PROSLIC_REG_OMODE);
+  if (cfg->eightBit)
+  {
+    data |= 0x80;
+  }
+  else
+  {
+    data &= ~(0x80);
+  }
+  WriteReg(pProslic,pProslic->channel,PROSLIC_REG_FSKDEPTH,cfg->fskdepth);
+  WriteReg(pProslic,pProslic->channel,PROSLIC_REG_OMODE,data);
+
+  for(i = 0; i < 2; i++)
+  {
+    WriteRAM(pProslic,pProslic->channel,PROSLIC_RAM_FSK01+i,cfg->fsk[i]);
+    WriteRAM(pProslic,pProslic->channel,PROSLIC_RAM_FSKAMP0+i,cfg->fskamp[i]);
+    WriteRAM(pProslic,pProslic->channel,PROSLIC_RAM_FSKFREQ0+i,cfg->fskfreq[i]);
+  }
+  return RC_NONE;
+}
+#endif
+
+/*****************************************************************************************************/
+int ProSLIC_EnableFastRingStart(proslicChanType_ptr pProslic, BOOLEAN isEnabled)
+{
+  uInt8 data;
+
+  TRACEPRINT(pProslic, "\n",NULL);
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_CHANNEL_TYPE_ERR;
+  }
+#if defined(SI3217X) && !defined(Si3217X_REVC_ONLY)
+  if (pProslic->deviceId->chipType >= SI32171
+      && pProslic->deviceId->chipType <= SI32179)
+  {
+    if(pProslic->deviceId->chipRev < 2)
+    {
+      return RC_UNSUPPORTED_FEATURE;
+    }
+  }
+#endif
+
+  data = ReadReg(pProslic, pProslic->channel, PROSLIC_REG_USERSTAT);
+
+  if( isEnabled )
+  {
+    data |= 8;
+  }
+  else
+  {
+    data &= ~8;
+  }
+
+  return WriteReg(pProslic, pProslic->channel, PROSLIC_REG_USERSTAT, data);
+}
+
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/src/proslic_tstin.c b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/src/proslic_tstin.c
new file mode 100644
index 0000000..f8f7a99
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/src/proslic_tstin.c
@@ -0,0 +1,1580 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Author(s):
+ * cdp
+ *
+ * Distributed by:
+ * Silicon Laboratories, Inc
+ *
+ * This file contains proprietary information.
+ * No dissemination allowed without prior written permission from
+ * Silicon Laboratories, Inc.
+ *
+ * File Description:
+ * This is the interface file for the ProSLIC test-in functions.
+ *
+ *
+ */
+
+#include "../config_inc/si_voice_datatypes.h"
+#include "../inc/si_voice_ctrl.h"
+#include "../inc/si_voice_timer_intf.h"
+#include "../inc/proslic.h"
+#include "../config_inc/proslic_api_config.h"
+#include "../inc/proslic_tstin.h"
+
+#ifdef SI3217X
+#include "si3217x.h"
+#include "si3217x_intf.h"
+#endif
+#ifdef SI3218X
+#include "../inc/si3218x.h"
+#include "../inc/si3218x_intf.h"
+#endif
+#ifdef SI3219X
+#include "si3219x.h"
+#include "si3219x_intf.h"
+#endif
+#ifdef SI3226X
+#include "si3226x.h"
+#include "si3226x_intf.h"
+#endif
+#ifdef SI3228X
+#include "si3228x.h"
+#include "si3228x_intf.h"
+#endif
+
+/*
+** Function Pointer Macros
+*/
+#define WriteReg        pProslic->deviceId->ctrlInterface->WriteRegister_fptr
+#define ReadReg         pProslic->deviceId->ctrlInterface->ReadRegister_fptr
+#define pProHW          pProslic->deviceId->ctrlInterface->hCtrl
+#define Reset           pProslic->deviceId->ctrlInterface->Reset_fptr
+#define Delay           pProslic->deviceId->ctrlInterface->Delay_fptr
+#define pProTimer       pProslic->deviceId->ctrlInterface->hTimer
+#define WriteRAM        pProslic->deviceId->ctrlInterface->WriteRAM_fptr
+#define ReadRAM         pProslic->deviceId->ctrlInterface->ReadRAM_fptr
+#define TimeElapsed     pProslic->deviceId->ctrlInterface->timeElapsed_fptr
+#define getTime         pProslic->deviceId->ctrlInterface->getTime_fptr
+#define SetSemaphore    pProslic->deviceId->ctrlInterface->Semaphore_fptr
+
+#define WriteRegX       deviceId->ctrlInterface->WriteRegister_fptr
+#define ReadRegX        deviceId->ctrlInterface->ReadRegister_fptr
+#define pProHWX         deviceId->ctrlInterface->hCtrl
+#define DelayX          deviceId->ctrlInterface->Delay_fptr
+#define pProTimerX      deviceId->ctrlInterface->hTimer
+#define WriteRAMX       deviceId->ctrlInterface->WriteRAM_fptr
+#define ReadRAMX        deviceId->ctrlInterface->ReadRAM_fptr
+#define getTimeX        deviceId->ctrlInterface->getTime_fptr
+#define TimeElapsedX    deviceId->ctrlInterface->timeElapsed_fptr
+
+/*
+* Valid Device Number Ranges
+*/
+
+#define TSTIN_VALID_SI3217X_PART_NUM (pProslic->deviceId->chipType >= SI32171 && pProslic->deviceId->chipType <= SI32179)
+#define TSTIN_VALID_SI3218X_PART_NUM (pProslic->deviceId->chipType >= SI32180 && pProslic->deviceId->chipType <= SI32189)
+#define TSTIN_VALID_SI3219X_PART_NUM (pProslic->deviceId->chipType >= SI32190 && pProslic->deviceId->chipType <= SI32199)
+#define TSTIN_VALID_SI3226X_PART_NUM (pProslic->deviceId->chipType >= SI32260 && pProslic->deviceId->chipType <= SI32269)
+#define TSTIN_VALID_SI3228X_PART_NUM (pProslic->deviceId->chipType >= SI32280 && pProslic->deviceId->chipType <= SI32289)
+
+#define TSTIN_INVALID_PART_NUM  !(TSTIN_VALID_SI3217X_PART_NUM ||\
+    TSTIN_VALID_SI3218X_PART_NUM || TSTIN_VALID_SI3219X_PART_NUM ||\
+    TSTIN_VALID_SI3226X_PART_NUM || TSTIN_VALID_SI3228X_PART_NUM)
+
+#define LOGPRINT_PREFIX "ProSLIC:"
+
+ProSLIC_DCfeed_Cfg ringtripTestDCFeedPreset[] =
+{
+  {
+    0x196038D8L,	/* SLOPE_VLIM */
+    0x1D707651L,	/* SLOPE_RFEED */
+    0x0040A0E0L,	/* SLOPE_ILIM */
+    0x1E07FE48L,	/* SLOPE_DELTA1 */
+    0x1ED62D87L,	/* SLOPE_DELTA2 */
+    0x01A50724L,	/* V_VLIM (14.000 v) */
+    0x016EE54FL,	/* V_RFEED (12.200 v) */
+    0x012CBBF5L,	/* V_ILIM  (10.000 v) */
+    0x00AF8C10L,	/* CONST_RFEED (10.000 mA) */
+    0x0045CBBCL,	/* CONST_ILIM (15.000 mA) */
+    0x000D494BL,	/* I_VLIM (0.000 mA) */
+    0x005B0AFBL,	/* LCRONHK (10.000 mA) */
+    0x006D4060L,	/* LCROFFHK (12.000 mA) */
+    0x00008000L,	/* LCRDBI (5.000 ms) */
+    0x0048D595L,	/* LONGHITH (8.000 mA) */
+    0x003FBAE2L,	/* LONGLOTH (7.000 mA) */
+    0x00008000L,	/* LONGDBI (5.000 ms) */
+    0x000F0000L,	/* LCRMASK (150.000 ms) */
+    0x00080000L,	/* LCRMASK_POLREV (80.000 ms) */
+    0x00140000L,	/* LCRMASK_STATE (200.000 ms) */
+    0x00140000L,	/* LCRMASK_LINECAP (200.000 ms) */
+    0x01999999L,	/* VCM_OH (25.000 v) */
+    0x0051EB85L,	/* VOV_BAT (5.000 v) */
+    0x00418937L 	/* VOV_GND (4.000 v) */
+  }
+};
+
+/*
+** dB lookup table
+*/
+#define DB_TABLE_STEP_SIZE     250
+#define MAX_DB_TABLE           279
+
+static const uInt32 dBTable10_n60 [] =
+{
+  31623,
+  30726,
+  29854,
+  29007,
+  28184,
+  27384,
+  26607,
+  25852,
+  25119,
+  24406,
+  23714,
+  23041,
+  22387,
+  21752,
+  21135,
+  20535,
+  19953,
+  19387,
+  18836,
+  18302,
+  17783,
+  17278,
+  16788,
+  16312,
+  15849,
+  15399,
+  14962,
+  14538,
+  14125,
+  13725,
+  13335,
+  12957,
+  12589,
+  12232,
+  11885,
+  11548,
+  11220,
+  10902,
+  10593,
+  10292,
+  10000,
+  9716,
+  9441,
+  9173,
+  8913,
+  8660,
+  8414,
+  8175,
+  7943,
+  7718,
+  7499,
+  7286,
+  7079,
+  6879,
+  6683,
+  6494,
+  6310,
+  6131,
+  5957,
+  5788,
+  5623,
+  5464,
+  5309,
+  5158,
+  5012,
+  4870,
+  4732,
+  4597,
+  4467,
+  4340,
+  4217,
+  4097,
+  3981,
+  3868,
+  3758,
+  3652,
+  3548,
+  3447,
+  3350,
+  3255,
+  3162,
+  3073,
+  2985,
+  2901,
+  2818,
+  2738,
+  2661,
+  2585,
+  2512,
+  2441,
+  2371,
+  2304,
+  2239,
+  2175,
+  2113,
+  2054,
+  1995,
+  1939,
+  1884,
+  1830,
+  1778,
+  1728,
+  1679,
+  1631,
+  1585,
+  1540,
+  1496,
+  1454,
+  1413,
+  1372,
+  1334,
+  1296,
+  1259,
+  1223,
+  1189,
+  1155,
+  1122,
+  1090,
+  1059,
+  1029,
+  1000,
+  972,
+  944,
+  917,
+  891,
+  866,
+  841,
+  818,
+  794,
+  772,
+  750,
+  729,
+  708,
+  688,
+  668,
+  649,
+  631,
+  613,
+  596,
+  579,
+  562,
+  546,
+  531,
+  516,
+  501,
+  487,
+  473,
+  460,
+  447,
+  434,
+  422,
+  410,
+  398,
+  387,
+  376,
+  365,
+  355,
+  345,
+  335,
+  325,
+  316,
+  307,
+  299,
+  290,
+  282,
+  274,
+  266,
+  259,
+  251,
+  244,
+  237,
+  230,
+  224,
+  218,
+  211,
+  205,
+  200,
+  194,
+  188,
+  183,
+  178,
+  173,
+  168,
+  163,
+  158,
+  154,
+  150,
+  145,
+  141,
+  137,
+  133,
+  130,
+  126,
+  122,
+  119,
+  115,
+  112,
+  109,
+  106,
+  103,
+  100,
+  97,
+  94,
+  92,
+  89,
+  87,
+  84,
+  82,
+  79,
+  77,
+  75,
+  73,
+  71,
+  69,
+  67,
+  65,
+  63,
+  61,
+  60,
+  58,
+  56,
+  55,
+  53,
+  52,
+  50,
+  49,
+  47,
+  46,
+  45,
+  43,
+  42,
+  41,
+  40,
+  39,
+  38,
+  37,
+  35,
+  34,
+  33,
+  33,
+  32,
+  31,
+  30,
+  29,
+  28,
+  27,
+  27,
+  26,
+  25,
+  24,
+  24,
+  23,
+  22,
+  22,
+  21,
+  21,
+  20,
+  19,
+  19,
+  18,
+  18,
+  17,
+  17,
+  16,
+  16,
+  15,
+  15,
+  15,
+  14,
+  14,
+  13,
+  13,
+  13,
+  12,
+  12,
+  12,
+  11,
+  11,
+  11,
+  10,
+  10
+};
+
+
+/* *********************************** */
+static int setInternalTestLoad(proslicChanType *pProslic, int connect)
+{
+  ramData ram_save;
+  ramData test_load_addr;
+  ramData test_load_bitmask;
+
+  if(pProslic->deviceId->chipType >= SI32171
+      && pProslic->deviceId->chipType <= SI32179)
+  {
+    test_load_addr = 1516;
+    test_load_bitmask = 0x00800000L;  /* bit 23 */
+  }
+  else
+  {
+    test_load_addr = 1611;
+    test_load_bitmask = 0x00040000L;  /* bit 18 */
+  }
+
+  ProSLIC_SetUserMode(pProslic,1,0);
+  ram_save = ProSLIC_ReadRAM(pProslic,test_load_addr);
+
+  if(connect)
+  {
+    ram_save |= test_load_bitmask;
+  }
+  else
+  {
+    ram_save &= ~test_load_bitmask;
+  }
+
+  ProSLIC_WriteRAM(pProslic,test_load_addr,ram_save);
+
+  return RC_NONE;
+}
+
+/* *********************************** */
+static void setup1kHzBandpass(proslicChanType *pProslic)
+{
+  /* 1kHz bandpass - Gain = -1.7055 */
+  ProSLIC_WriteRAM(pProslic, 32, 0x180A50L);	/* TESTB0_1 */
+  ProSLIC_WriteRAM(pProslic, 33, 0x0L);		/* TESTB1_1 */
+  ProSLIC_WriteRAM(pProslic, 34, 0x1FE7F5B0L);/* TESTB2_1 */
+  ProSLIC_WriteRAM(pProslic, 35, 0xB166220L);	/* TESTA1_1 */
+  ProSLIC_WriteRAM(pProslic, 36, 0x185119D0L);/* TESTA2_1 */
+  ProSLIC_WriteRAM(pProslic, 37, 0xAF624E0L);	/* TESTB0_2 */
+  ProSLIC_WriteRAM(pProslic, 38, 0x0L);		/* TESTB1_2 */
+  ProSLIC_WriteRAM(pProslic, 39, 0xAF624E0L);	/* TESTB2_2 */
+  ProSLIC_WriteRAM(pProslic, 40, 0x0L); 		/* TESTA1_2 */
+  ProSLIC_WriteRAM(pProslic, 41, 0x185119D0L);/* TESTA2_2 */
+  ProSLIC_WriteRAM(pProslic, 42, 0x7C6E410L);	/* TESTB0_3 */
+  ProSLIC_WriteRAM(pProslic, 43, 0xAFF8B80L);	/* TESTB1_3 */
+  ProSLIC_WriteRAM(pProslic, 44, 0x7C6E410L);	/* TESTB2_3 */
+  ProSLIC_WriteRAM(pProslic, 45, 0x14E99DE0L);/* TESTA1_3 */
+  ProSLIC_WriteRAM(pProslic, 46, 0x185119D0L);/* TESTA2_3 */
+  ProSLIC_WriteRAM(pProslic, 50, 0x40000L);	/* TESTAVBW */
+  ProSLIC_WriteRAM(pProslic, 49, 0x1F40000L);	/* TESTWLN */
+  ProSLIC_WriteRAM(pProslic, 54, 0x0L);		/* TESTAVTH */
+  ProSLIC_WriteRAM(pProslic, 53, 0x0L);		/* TESTPKTH */
+}
+
+/* *********************************** */
+/* Return value in dB*1000 (mdB) */
+static int32 dBLookup(uInt32 number)
+{
+  int i;
+  uInt32 err;
+
+  if(number >= dBTable10_n60[0])
+  {
+    return 10000;  /* out of range - clamp at 10dB */
+  }
+
+  for(i=0; i<MAX_DB_TABLE; i++) /* 139 */
+  {
+    if((number < dBTable10_n60[i])&&(number >= dBTable10_n60[i+1]))
+    {
+      /* See which level it is closest to */
+      err = dBTable10_n60[i] - number;
+      if(err < (number - dBTable10_n60[i+1]))
+      {
+        return (10000 - i*DB_TABLE_STEP_SIZE);
+      }
+      else
+      {
+        return (10000 - (i+1)*DB_TABLE_STEP_SIZE);
+      }
+    }
+  }
+  /* No solution found?  Return -60dB */
+  return -60000;
+}
+
+/* *********************************** */
+static int32 readAudioDiagLevel(proslicChanType *pProslic,int32 zero_dbm_mvpk)
+{
+  int32 data;
+
+  data = ProSLIC_ReadRAM(pProslic,47); /* TESTPKO */
+  DEBUG_PRINT(pProslic, "TESTPKO = %d\n", (int)data);
+
+  data /= 40145;         /* 2^28 * 0.182 * 10^(Gfilt/20) */
+  data *= 1000;
+  data /= zero_dbm_mvpk;
+  data *= 10;
+
+  return(dBLookup(data));
+}
+
+/* *********************************** */
+static char *applyTestLimits(proslicTestObj *test)
+{
+  if((test->value >= test->lowerLimit)&&(test->value <= test->upperLimit))
+  {
+    test->testResult = RC_TEST_PASSED;
+    return ("PASS");
+  }
+  else
+  {
+    test->testResult = RC_TEST_FAILED;
+    return ("FAIL");
+  }
+}
+
+
+
+/* *********************************** */
+static int logTest(proslicChanType *pProslic,proslicTestObj *test,
+                   const char *label)
+{
+  char resultStr[10];
+  SIVOICE_STRCPY(resultStr,applyTestLimits(test));
+  DEBUG_PRINT(pProslic, "ProSLIC : TestIn : %-14s = %-8d :: %s\n", label, (int)(test->value),
+             resultStr);
+#ifndef ENABLE_DEBUG
+  SILABS_UNREFERENCED_PARAMETER(pProslic);
+  SILABS_UNREFERENCED_PARAMETER(label);
+#endif
+  return test->testResult;
+
+}
+/* *********************************** */
+static int logStatus(proslicChanType *pProslic, int status,const char *label)
+{
+  DEBUG_PRINT(pProslic, "ProSLIC : TestIn : %-14s = %d\n", label,status);
+#ifndef ENABLE_DEBUG
+  SILABS_UNREFERENCED_PARAMETER(pProslic);
+  SILABS_UNREFERENCED_PARAMETER(label);
+  SILABS_UNREFERENCED_PARAMETER(status);
+#endif
+  return RC_NONE;
+}
+
+/* *********************************** */
+static uInt32 Isqrt32(uInt32 num)
+{
+  uInt32 one,res,op;
+
+  op=num;
+  res=0;
+  one = 1L << 30;
+  while(one > op)
+  {
+    one >>=2;
+  }
+
+  while(one !=0)
+  {
+    if(op >= res + one)
+    {
+      op = op - (res + one);
+      res = res + 2*one;
+    }
+    res >>= 1;
+    one >>= 2;
+  }
+
+  return (res);
+}
+
+
+/* *********************************** */
+static int storeDCFeedPreset(proslicChanType *pProslic,ProSLIC_DCfeed_Cfg *cfg,uInt8 preset)
+{
+  cfg[preset].slope_vlim = ProSLIC_ReadRAM(pProslic,634);
+  cfg[preset].slope_rfeed = ProSLIC_ReadRAM(pProslic,635);
+  cfg[preset].slope_ilim = ProSLIC_ReadRAM(pProslic,636);
+  cfg[preset].delta1 = ProSLIC_ReadRAM(pProslic,638);
+  cfg[preset].delta2 = ProSLIC_ReadRAM(pProslic,639);
+  cfg[preset].v_vlim = ProSLIC_ReadRAM(pProslic,640);
+  cfg[preset].v_rfeed = ProSLIC_ReadRAM(pProslic,641);
+  cfg[preset].v_ilim = ProSLIC_ReadRAM(pProslic,642);
+  cfg[preset].const_rfeed = ProSLIC_ReadRAM(pProslic,643);
+  cfg[preset].const_ilim = ProSLIC_ReadRAM(pProslic,644);
+  cfg[preset].i_vlim = ProSLIC_ReadRAM(pProslic,645);
+  cfg[preset].lcronhk = ProSLIC_ReadRAM(pProslic,853);
+  cfg[preset].lcroffhk = ProSLIC_ReadRAM(pProslic,852);
+  cfg[preset].lcrdbi = ProSLIC_ReadRAM(pProslic,701);
+  cfg[preset].longhith = ProSLIC_ReadRAM(pProslic,858);
+  cfg[preset].longloth = ProSLIC_ReadRAM(pProslic,859);
+  cfg[preset].longdbi = ProSLIC_ReadRAM(pProslic,702);
+  cfg[preset].lcrmask = ProSLIC_ReadRAM(pProslic,854);
+  cfg[preset].lcrmask_polrev = ProSLIC_ReadRAM(pProslic,855);
+  cfg[preset].lcrmask_state = ProSLIC_ReadRAM(pProslic,856);
+  cfg[preset].lcrmask_linecap = ProSLIC_ReadRAM(pProslic,857);
+  cfg[preset].vcm_oh = ProSLIC_ReadRAM(pProslic,748);
+  cfg[preset].vov_bat = ProSLIC_ReadRAM(pProslic,752);
+  cfg[preset].vov_gnd = ProSLIC_ReadRAM(pProslic,751);
+
+  return RC_NONE;
+}
+
+
+/* *********************************** */
+int ProSLIC_createTestInObjs(proslicTestInObjType_ptr *pTstin, uInt32 num_objs)
+{
+#ifndef DISABLE_MALLOC
+  *pTstin = SIVOICE_CALLOC(sizeof(proslicTestInObjType),num_objs);
+
+  if(*pTstin == NULL)
+  {
+#ifdef ENABLE_DEBUG
+    LOGPRINT("%s: %s: failed to allocate memory", LOGPRINT_PREFIX, __FUNCTION__);
+#endif
+    return RC_NO_MEM;
+  }
+
+  return RC_NONE;
+#else
+  SILABS_UNREFERENCED_PARAMETER(pTstin);
+  SILABS_UNREFERENCED_PARAMETER(num_objs);
+  return RC_UNSUPPORTED_FEATURE;
+#endif
+}
+/* *********************************** */
+int ProSLIC_destroyTestInObjs(proslicTestInObjType_ptr *pTstin)
+{
+#ifndef DISABLE_MALLOC
+  SIVOICE_FREE((proslicTestInObjType_ptr) *pTstin);
+  *pTstin = NULL;
+  return RC_NONE;
+#else
+  SILABS_UNREFERENCED_PARAMETER(pTstin);
+  return RC_UNSUPPORTED_FEATURE;
+#endif
+}
+
+/* *********************************** */
+int ProSLIC_testInPCMLpbkEnable(proslicChanType *pProslic,
+                                proslicTestInObjType *pTstin)
+{
+  uInt8 regData;
+
+  /* Valid device check */
+  if(TSTIN_INVALID_PART_NUM)
+  {
+    return RC_UNSUPPORTED_FEATURE;
+  }
+
+  /* Check if enabled */
+  if(!pTstin->pcmLpbkTest.testEnable)
+  {
+    return RC_TEST_DISABLED;
+  }
+  /* Return if already enabled */
+  if(pTstin->pcmLpbkTest.pcmLpbkEnabled)
+  {
+    return RC_NONE;
+  }
+
+  /* Store PCM Settings */
+  pTstin->pcmLpbkTest.pcmModeSave = ProSLIC_ReadReg(pProslic,11); /* PCMMODE */
+
+
+  /* Disable PCM bus before changing format */
+  regData = pTstin->pcmLpbkTest.pcmModeSave & ~0x10; /* PCM_EN = 0 */
+  ProSLIC_WriteReg(pProslic,11,regData);
+
+  /* Configure for either 8 or 16bit linear */
+  if(pTstin->pcmLpbkTest.pcm8BitLinear == PCM_8BIT)
+  {
+    regData |= 0x02;   /* PCM_FMT[1] = 1 */
+    regData &= ~0x01;  /* PCM_FMT[0] = 0 */
+  }
+  else /* PCM_16BIT */
+  {
+    regData |= 0x03;  /* PCM_FMT[1:0] = 11 */
+  }
+
+  ProSLIC_WriteReg(pProslic,11,regData);
+
+  /* Enable PCM Loopback */
+  ProSLIC_WriteReg(pProslic,43,0x01);  /* LOOPBACK */
+
+  /* Re-enable PCM Bus */
+  ProSLIC_WriteReg(pProslic,11,regData|0x10);  /* PCMMODE */
+
+  pTstin->pcmLpbkTest.pcmLpbkEnabled = 1;
+  DEBUG_PRINT(pProslic, "ProSLIC : TestIn : pcmLpbk : ENABLED\n");
+  return RC_NONE;
+}
+
+/* *********************************** */
+int ProSLIC_testInPCMLpbkDisable(proslicChanType *pProslic,
+                                 proslicTestInObjType *pTstin)
+{
+  uInt8 regData;
+
+  /* Valid device check */
+  if(TSTIN_INVALID_PART_NUM)
+  {
+    return RC_UNSUPPORTED_FEATURE;
+  }
+
+  /* Check if enabled */
+  if(!pTstin->pcmLpbkTest.testEnable)
+  {
+    return RC_TEST_DISABLED;
+  }
+
+  /* Return if already disabled */
+  if(!pTstin->pcmLpbkTest.pcmLpbkEnabled)
+  {
+    return RC_NONE;
+  }
+
+  /* Disable PCM Bus */
+  regData = ProSLIC_ReadReg(pProslic,11); /* PCMMODE */
+  ProSLIC_WriteReg(pProslic,11,regData &= ~0x10);
+
+  /* Disable PCM Loopback */
+  ProSLIC_WriteReg(pProslic,43,0);
+
+  /* Restore PCMMODE. Force disabled while changing format */
+  ProSLIC_WriteReg(pProslic,11,pTstin->pcmLpbkTest.pcmModeSave &= ~0x10);
+  ProSLIC_WriteReg(pProslic,11,pTstin->pcmLpbkTest.pcmModeSave);
+
+  pTstin->pcmLpbkTest.pcmLpbkEnabled = 0;
+  DEBUG_PRINT(pProslic, "ProSLIC : TestIn : pcmLpbk : DISABLED\n");
+  return RC_NONE;
+}
+
+/* *************************************************** */
+
+int ProSLIC_testInDCFeed(proslicChanType *pProslic,
+                         proslicTestInObjType *pTstin)
+{
+  uInt8 enhanceRegSave;
+  proslicMonitorType monitor;
+  ramData lcroffhk_save = 0;
+  ramData lcronhk_save = 0;
+
+  /* Valid device check */
+  if(TSTIN_INVALID_PART_NUM)
+  {
+    return RC_UNSUPPORTED_FEATURE;
+  }
+
+  /* Check if enabled */
+  if(!pTstin->dcFeedTest.testEnable)
+  {
+    return RC_TEST_DISABLED;
+  }
+
+  /* Invalidate last test results */
+  pTstin->dcFeedTest.testDataValid = TSTIN_RESULTS_INVALID;
+
+  /* Verify line not in use */
+  if(ProSLIC_ReadReg(pProslic,34) & 0x02)  /* LCR */
+  {
+    DEBUG_PRINT(pProslic, "\nProSLIC : TestIn : DC Feed : Line in Use\n");
+
+    if(pTstin->dcFeedTest.abortIfLineInUse==ABORT_LIU_ENABLED)
+    {
+      return RC_LINE_IN_USE;
+    }
+  }
+
+  /* Disable Powersave */
+  enhanceRegSave = ProSLIC_ReadReg(pProslic,47);
+  ProSLIC_WriteReg(pProslic,47,0x20);
+  Delay(pProTimer,10);
+
+  /* Onhook measurement */
+  ProSLIC_LineMonitor(pProslic,&monitor);
+
+  pTstin->dcFeedTest.dcfeedVtipOnhook.value = monitor.vtip;
+  pTstin->dcFeedTest.dcfeedVringOnhook.value = monitor.vring;
+  pTstin->dcFeedTest.dcfeedVloopOnhook.value = monitor.vtr;
+  pTstin->dcFeedTest.dcfeedVbatOnhook.value = monitor.vbat;
+  pTstin->dcFeedTest.dcfeedItipOnhook.value = monitor.itip;
+  pTstin->dcFeedTest.dcfeedIringOnhook.value = monitor.iring;
+  pTstin->dcFeedTest.dcfeedIloopOnhook.value = monitor.itr;
+  pTstin->dcFeedTest.dcfeedIlongOnhook.value = monitor.ilong;
+
+  /* Modify LCR threshold (optional) before connecting test load */
+  if(pTstin->dcFeedTest.applyLcrThresh == LCR_CHECK_ENABLED)
+  {
+    lcroffhk_save = ProSLIC_ReadRAM(pProslic,852);
+    lcronhk_save = ProSLIC_ReadRAM(pProslic,853);
+    ProSLIC_WriteRAM(pProslic,852,pTstin->dcFeedTest.altLcrOffThresh);
+    ProSLIC_WriteRAM(pProslic,853,pTstin->dcFeedTest.altLcrOnThresh);
+  }
+
+  /* Connect internal test load for 2nd dc feed i/v point */
+  setInternalTestLoad(pProslic,1);
+  Delay(pProTimer,50);
+  /* Offhook measurement */
+  ProSLIC_LineMonitor(pProslic,&monitor);
+
+  pTstin->dcFeedTest.dcfeedVtipOffhook.value = monitor.vtip;
+  pTstin->dcFeedTest.dcfeedVringOffhook.value = monitor.vring;
+  pTstin->dcFeedTest.dcfeedVloopOffhook.value = monitor.vtr;
+  pTstin->dcFeedTest.dcfeedVbatOffhook.value = monitor.vbat;
+  pTstin->dcFeedTest.dcfeedItipOffhook.value = monitor.itip;
+  pTstin->dcFeedTest.dcfeedIringOffhook.value = monitor.iring;
+  pTstin->dcFeedTest.dcfeedIloopOffhook.value = monitor.itr;
+  pTstin->dcFeedTest.dcfeedIlongOffhook.value = monitor.ilong;
+
+  pTstin->dcFeedTest.testResult = RC_TEST_PASSED;  /* initialize */
+  /* Read LCR */
+  if(ProSLIC_ReadReg(pProslic,34) & 0x07)  /* LCRRTP */
+  {
+    pTstin->dcFeedTest.lcrStatus = 1;
+  }
+  else
+  {
+    pTstin->dcFeedTest.lcrStatus = 0;
+  }
+
+  /* Only fail check if enabled */
+  if(pTstin->dcFeedTest.applyLcrThresh == LCR_CHECK_ENABLED)
+  {
+    pTstin->dcFeedTest.testResult |= !pTstin->dcFeedTest.lcrStatus;
+  }
+
+  /* Disconnect Test Load */
+  setInternalTestLoad(pProslic,0);
+
+  /* Restore LCR thresholds */
+  if(pTstin->dcFeedTest.applyLcrThresh == LCR_CHECK_ENABLED)
+  {
+    ProSLIC_WriteRAM(pProslic,852,lcroffhk_save);
+    ProSLIC_WriteRAM(pProslic,853,lcronhk_save);
+  }
+
+  /* Restore enhance reg */
+  ProSLIC_WriteReg(pProslic,47,enhanceRegSave);
+
+  /* Process Results */
+  pTstin->dcFeedTest.testResult |= logTest(pProslic,
+                                   &(pTstin->dcFeedTest.dcfeedVtipOnhook),"DcFeed : Vtip Onhook");
+  pTstin->dcFeedTest.testResult |= logTest(pProslic,
+                                   &(pTstin->dcFeedTest.dcfeedVringOnhook),"DcFeed : Vring Onhook");
+  pTstin->dcFeedTest.testResult |= logTest(pProslic,
+                                   &(pTstin->dcFeedTest.dcfeedVloopOnhook),"DcFeed : Vloop Onhook");
+  pTstin->dcFeedTest.testResult |= logTest(pProslic,
+                                   &(pTstin->dcFeedTest.dcfeedVbatOnhook),"DcFeed : Vbat Onhook");
+  pTstin->dcFeedTest.testResult |= logTest(pProslic,
+                                   &(pTstin->dcFeedTest.dcfeedItipOnhook),"DcFeed : Itip Onhook");
+  pTstin->dcFeedTest.testResult |= logTest(pProslic,
+                                   &(pTstin->dcFeedTest.dcfeedIringOnhook),"DcFeed : Iring Onhook");
+  pTstin->dcFeedTest.testResult |= logTest(pProslic,
+                                   &(pTstin->dcFeedTest.dcfeedIloopOnhook),"DcFeed : Iloop Onhook");
+  pTstin->dcFeedTest.testResult |= logTest(pProslic,
+                                   &(pTstin->dcFeedTest.dcfeedIlongOnhook),"DcFeed : Ilong Onhook");
+
+  pTstin->dcFeedTest.testResult |= logTest(pProslic,
+                                   &(pTstin->dcFeedTest.dcfeedVtipOffhook),"DcFeed : Vtip Offhook");
+  pTstin->dcFeedTest.testResult |= logTest(pProslic,
+                                   &(pTstin->dcFeedTest.dcfeedVringOffhook),"DcFeed : Vring Offhook");
+  pTstin->dcFeedTest.testResult |= logTest(pProslic,
+                                   &(pTstin->dcFeedTest.dcfeedVloopOffhook),"DcFeed : Vloop Offhook");
+  pTstin->dcFeedTest.testResult |= logTest(pProslic,
+                                   &(pTstin->dcFeedTest.dcfeedVbatOffhook),"DcFeed : Vbat Offhook");
+  pTstin->dcFeedTest.testResult |= logTest(pProslic,
+                                   &(pTstin->dcFeedTest.dcfeedItipOffhook),"DcFeed : Itip Offhook");
+  pTstin->dcFeedTest.testResult |= logTest(pProslic,
+                                   &(pTstin->dcFeedTest.dcfeedIringOffhook),"DcFeed : Iring Offhook");
+  pTstin->dcFeedTest.testResult |= logTest(pProslic,
+                                   &(pTstin->dcFeedTest.dcfeedIloopOffhook),"DcFeed : Iloop Offhook");
+  pTstin->dcFeedTest.testResult |= logTest(pProslic,
+                                   &(pTstin->dcFeedTest.dcfeedIlongOffhook),"DcFeed : Ilong Offhook");
+
+  logStatus(pProslic,pTstin->dcFeedTest.lcrStatus,"DcFeed : LCR");
+
+
+  pTstin->dcFeedTest.testDataValid = 1;   /* New valid results */
+
+  /* return cumulative pass/fail result */
+
+  return (pTstin->dcFeedTest.testResult);
+}
+
+/* *********************************** */
+int ProSLIC_testInRinging(proslicChanType *pProslic,
+                          proslicTestInObjType *pTstin)
+{
+  uInt8 ringcon_save,enhance_save;
+  int32 vtr[MAX_RINGING_SAMPLES];
+  int i;
+  uInt8 lf;
+  uInt32 rtper_save, ringfr_save,ringamp_save,ringof_save,rtacth_save,rtdcth_save;
+  ProSLIC_DCfeed_Cfg dcfeedCfg[1];
+
+  /* Valid device check */
+  if(TSTIN_INVALID_PART_NUM)
+  {
+    return RC_UNSUPPORTED_FEATURE;
+  }
+
+  /* Check if enabled */
+  if( (!pTstin->ringingTest.testEnable)
+      || (pTstin->ringingTest.numSamples == 0) )
+  {
+    return RC_TEST_DISABLED;
+  }
+
+  /* Verify line not in use */
+  if(ProSLIC_ReadReg(pProslic,34) & 0x02)  /* LCR */
+  {
+    DEBUG_PRINT(pProslic, "\nProSLIC : TestIn : Ringing : Line in Use\n");
+
+    if(pTstin->ringingTest.abortIfLineInUse)
+    {
+      return RC_LINE_IN_USE;
+    }
+  }
+
+  /* Invalidate last test results */
+  pTstin->ringingTest.testDataValid = TSTIN_RESULTS_INVALID;
+
+  /* Check sample size/rate */
+  if(pTstin->ringingTest.numSamples > MAX_RINGING_SAMPLES)
+  {
+    pTstin->ringingTest.numSamples = MAX_RINGING_SAMPLES;
+  }
+
+  if(pTstin->ringingTest.sampleInterval > MAX_RINGING_SAMPLE_INTERVAL)
+  {
+    pTstin->ringingTest.sampleInterval = MAX_RINGING_SAMPLE_INTERVAL;
+  }
+
+  if(pTstin->ringingTest.sampleInterval < MIN_RINGING_SAMPLE_INTERVAL)
+  {
+    pTstin->ringingTest.sampleInterval = MIN_RINGING_SAMPLE_INTERVAL;
+  }
+
+  /* Disable Powersave */
+  enhance_save = ProSLIC_ReadReg(pProslic,47);
+  ProSLIC_WriteReg(pProslic,47,0x20);
+  Delay(pProTimer,10);
+
+  /* Disable ring cadencing */
+  ringcon_save = ProSLIC_ReadReg(pProslic,38); /* RINGCON */
+  ProSLIC_WriteReg(pProslic,38,ringcon_save&0xE7); /* RINGCON */
+
+  /* Must enter ringing through active state */
+  lf = ProSLIC_ReadReg(pProslic,30);  /* LINEFEED */
+  ProSLIC_SetLinefeedStatus(pProslic,LF_FWD_ACTIVE);
+  Delay(pProTimer,20); /* settle */
+
+  /* Start ringing */
+  ProSLIC_SetLinefeedStatus(pProslic,LF_RINGING);
+  Delay(pProTimer,500);
+
+  /* Verify Ring Started */
+  if(ProSLIC_ReadReg(pProslic,30) != 0x44)
+  {
+    ProSLIC_SetLinefeedStatus(pProslic,LF_FWD_ACTIVE);
+    ProSLIC_SetLinefeedStatus(pProslic,LF_OPEN);
+    ProSLIC_WriteReg(pProslic,38,ringcon_save);
+    ProSLIC_WriteReg(pProslic,47,enhance_save);
+    ProSLIC_SetLinefeedStatus(pProslic,lf);
+    
+    DEBUG_PRINT(pProslic, "ProSLIC : TestIn : Ringing : Ring Start Fail\n");
+
+    pTstin->ringingTest.testResult = RC_TEST_FAILED;
+    return RC_RING_START_FAIL;
+  }
+
+  /* Capture samples */
+  pTstin->ringingTest.ringingVdc.value = 0;
+  for(i=0; i<pTstin->ringingTest.numSamples; i++)
+  {
+    vtr[i] = ProSLIC_ReadMADCScaled(pProslic,69,0); /* VDIFF_FILT */
+    pTstin->ringingTest.ringingVdc.value += vtr[i];
+
+    DEBUG_PRINT(pProslic, "ProSLIC : TestIn : Ringing : Vtr[%d] = %d\n",i, (int)(vtr[i]));
+
+    Delay(pProTimer,pTstin->ringingTest.sampleInterval);
+  }
+
+  /* Restore linefeed */
+  ProSLIC_SetLinefeedStatus(pProslic,LF_FWD_ACTIVE);
+  Delay(pProTimer,20);
+
+  /* Process Results */
+  pTstin->ringingTest.ringingVdc.value /= pTstin->ringingTest.numSamples;
+  for(i=0; i<pTstin->ringingTest.numSamples; i++)
+  {
+    vtr[i] -= pTstin->ringingTest.ringingVdc.value;
+    pTstin->ringingTest.ringingVac.value += ((vtr[i]/100L) * (vtr[i]/100L));
+  }
+
+
+  pTstin->ringingTest.ringingVac.value /= pTstin->ringingTest.numSamples;
+  pTstin->ringingTest.ringingVac.value = Isqrt32(
+      pTstin->ringingTest.ringingVac.value);
+  pTstin->ringingTest.ringingVac.value *= 100L;
+
+  pTstin->ringingTest.testResult = RC_TEST_PASSED;
+  pTstin->ringingTest.testResult |= logTest(pProslic,
+                                    &(pTstin->ringingTest.ringingVdc),"Ringing : VDC");
+  pTstin->ringingTest.testResult |= logTest(pProslic,
+                                    &(pTstin->ringingTest.ringingVac),"Ringing : VAC");
+  /*
+  ** Optional Ringtrip Test
+  */
+
+  if(pTstin->ringingTest.ringtripTestEnable == RTP_CHECK_ENABLED)
+  {
+    /* Setup low voltage linefeed so low level ringing may be used */
+    ProSLIC_SetLinefeedStatus(pProslic,LF_OPEN);
+    storeDCFeedPreset(pProslic,&(dcfeedCfg[0]),0);
+    ProSLIC_DCFeedSetupCfg(pProslic,&(ringtripTestDCFeedPreset[0]),0);
+
+    /* Optional Ringtrip Test (modified ringer settings to use test load to trip) */
+    rtper_save = ProSLIC_ReadRAM(pProslic,755);
+    ringfr_save = ProSLIC_ReadRAM(pProslic,844);
+    ringamp_save = ProSLIC_ReadRAM(pProslic,845);
+    ringof_save = ProSLIC_ReadRAM(pProslic,843);
+    rtacth_save = ProSLIC_ReadRAM(pProslic,848);
+    rtdcth_save = ProSLIC_ReadRAM(pProslic,847);
+
+    ProSLIC_WriteRAM(pProslic,755,0x50000L);  /* RTPER */
+    ProSLIC_WriteRAM(pProslic,844,0x7EFE000L);/* RINGFR */
+    ProSLIC_WriteRAM(pProslic,845,0xD6307L);  /* RINGAMP */
+    ProSLIC_WriteRAM(pProslic,843,0x0L);      /* RINGOF */
+    ProSLIC_WriteRAM(pProslic,848,0x7827FL);  /* RTACTH */
+    ProSLIC_WriteRAM(pProslic,847,0xFFFFFFFL);/* RTDCTH */
+
+    /* Start ringing from active state */
+    ProSLIC_SetLinefeedStatus(pProslic,LF_FWD_ACTIVE);
+    Delay(pProTimer,20);
+    ProSLIC_SetLinefeedStatus(pProslic,LF_RINGING);
+    Delay(pProTimer,200);
+
+    /* Verify Ring Started */
+    if(ProSLIC_ReadReg(pProslic,30) != 0x44)
+    {
+      ProSLIC_SetLinefeedStatus(pProslic,LF_FWD_ACTIVE);
+      ProSLIC_SetLinefeedStatus(pProslic,LF_OPEN);
+      ProSLIC_WriteReg(pProslic,38,ringcon_save);
+      ProSLIC_WriteReg(pProslic,47,enhance_save);
+      
+      /* Restore DC Feed */
+      ProSLIC_DCFeedSetupCfg(pProslic,&(dcfeedCfg[0]),0);
+
+      /* Restore Ring Settings */
+      ProSLIC_WriteRAM(pProslic,755,rtper_save); /* RTPER */
+      ProSLIC_WriteRAM(pProslic,844,ringfr_save); /*RINGFR */
+      ProSLIC_WriteRAM(pProslic,845,ringamp_save); /* RINGAMP */
+      ProSLIC_WriteRAM(pProslic,843,ringof_save); /* RINGOF */
+      ProSLIC_WriteRAM(pProslic,848,rtacth_save); /* RTACTH */
+      ProSLIC_WriteRAM(pProslic,847,rtdcth_save); /* RTDCTH */
+      
+      ProSLIC_SetLinefeedStatus(pProslic,lf);
+
+      DEBUG_PRINT(pProslic, "ProSLIC : TestIn : Ringtrip : Ring Start Fail\n");
+
+      pTstin->ringingTest.testResult=RC_TEST_FAILED;
+      return RC_RING_START_FAIL;
+    }
+
+    /* Connect Test Load to cause ringtrip */
+    setInternalTestLoad(pProslic,1);
+    Delay(pProTimer,200);
+
+    /* Check for RTP */
+    if(ProSLIC_ReadReg(pProslic,34) & 0x01)  /* LCRRTP */
+    {
+      pTstin->ringingTest.rtpStatus = 1;
+      pTstin->ringingTest.testResult |= RC_TEST_PASSED;
+    }
+    else
+    {
+      pTstin->ringingTest.rtpStatus = 0;
+      pTstin->ringingTest.testResult |= RC_TEST_FAILED;
+      ProSLIC_SetLinefeedStatus(pProslic,LF_FWD_ACTIVE);
+    }
+    setInternalTestLoad(pProslic,0);
+    Delay(pProTimer,20);
+
+    logStatus(pProslic,pTstin->ringingTest.rtpStatus,"Ringing : RTP");
+
+    /* Restore DC Feed */
+    ProSLIC_DCFeedSetupCfg(pProslic,&(dcfeedCfg[0]),0);
+
+    /* Restore Ring Settings */
+    ProSLIC_WriteRAM(pProslic,755,rtper_save);/* RTPER */
+    ProSLIC_WriteRAM(pProslic,844,ringfr_save);/*RINGFR */
+    ProSLIC_WriteRAM(pProslic,845,ringamp_save); /* RINGAMP */
+    ProSLIC_WriteRAM(pProslic,843,ringof_save); /* RINGOF */
+    ProSLIC_WriteRAM(pProslic,848,rtacth_save);/* RTACTH */
+    ProSLIC_WriteRAM(pProslic,847,rtdcth_save);/* RTDCTH */
+
+  }/* end of ringtrip test  */
+
+  /* Restore Linefeed */
+  ProSLIC_SetLinefeedStatus(pProslic,lf);
+
+  /* Restore RINGCON and ENHANCE */
+  ProSLIC_WriteReg(pProslic,38,ringcon_save);
+  ProSLIC_WriteReg(pProslic,47,enhance_save);
+
+  pTstin->ringingTest.testDataValid = TSTIN_RESULTS_VALID;
+
+  return (pTstin->ringingTest.testResult);
+}
+
+/* *********************************** */
+int ProSLIC_testInBattery(proslicChanType *pProslic,
+                          proslicTestInObjType *pTstin)
+{
+  proslicMonitorType monitor;
+
+  /* Valid device check */
+  if(TSTIN_INVALID_PART_NUM)
+  {
+    return RC_UNSUPPORTED_FEATURE;
+  }
+
+  /* Check if enabled */
+  if(!pTstin->batteryTest.testEnable)
+  {
+    return RC_TEST_DISABLED;
+  }
+
+  /* Invalidate last test results */
+  pTstin->batteryTest.testDataValid = TSTIN_RESULTS_INVALID;
+
+  /* Measure Battery */
+  ProSLIC_LineMonitor(pProslic,&monitor);
+
+  pTstin->batteryTest.vbat.value = monitor.vbat;
+
+  pTstin->batteryTest.testResult = logTest(pProslic,&(pTstin->batteryTest.vbat),
+                                   "Battery : VBAT");
+
+  pTstin->batteryTest.testDataValid =
+    TSTIN_RESULTS_VALID;   /* New valid results */
+
+  return (pTstin->batteryTest.testResult);
+}
+
+/* *********************************** */
+int ProSLIC_testInAudio(proslicChanType *pProslic, proslicTestInObjType *pTstin)
+{
+  uInt8 enhanceRegSave;
+  uInt8 lf;
+  int32 data;
+  int32 gainMeas1,gainMeas2;
+  int32 gainMeas3 = 0;
+  ProSLIC_audioGain_Cfg gainCfg;
+  int32 Pin = -3980;   /* -10dBm + 6.02dB (since OHT w/ no AC load) */
+
+  /* Valid device check */
+  if(TSTIN_INVALID_PART_NUM)
+  {
+    return RC_UNSUPPORTED_FEATURE;
+  }
+
+  /* Check if enabled */
+  if(!pTstin->audioTest.testEnable)
+  {
+    return RC_TEST_DISABLED;
+  }
+
+  /* Invalidate last test results */
+  pTstin->audioTest.testDataValid = TSTIN_RESULTS_INVALID;
+
+  /* Verify line not in use */
+  if(ProSLIC_ReadReg(pProslic,34) & 0x02)  /* LCR */
+  {
+    DEBUG_PRINT(pProslic, "\nProSLIC : TestIn : Audio : Line in Use\n");
+
+    if(pTstin->audioTest.abortIfLineInUse == ABORT_LIU_ENABLED)
+    {
+      return RC_LINE_IN_USE;
+    }
+  }
+
+  /* Disable Powersave */
+  enhanceRegSave = ProSLIC_ReadReg(pProslic,47);
+  ProSLIC_WriteReg(pProslic,47,0x20);
+  Delay(pProTimer,10);
+
+
+  /* Setup Audio Filter, enable audio in OHT */
+  lf = ProSLIC_ReadReg(pProslic,30);  /* LINEFEED */
+  ProSLIC_SetLinefeedStatus(pProslic,LF_FWD_ACTIVE);
+  Delay(pProTimer,20); /* settle */
+  setup1kHzBandpass(pProslic);
+  ProSLIC_SetLinefeedStatus(pProslic,LF_FWD_OHT);
+
+  /* Setup osc1 for 1kHz -10dBm tone, disable hybrid, enable filters */
+  ProSLIC_WriteRAM(pProslic,26,0x5A80000L); /* OSC1FREQ */
+  ProSLIC_WriteRAM(pProslic,27,0x5D8000L);  /* OSC1AMP */
+  ProSLIC_WriteReg(pProslic,48,0x02);       /* OMODE */
+  ProSLIC_WriteReg(pProslic,49,0x01);       /* OCON */
+  ProSLIC_WriteReg(pProslic,44,0x10);       /* DIGCON */
+  ProSLIC_WriteReg(pProslic,71,0x10);       /* DIAG1 */
+
+  /* Settle */
+  Delay(pProTimer,800);
+
+  /* Read first gain measurement (Gtx + Grx + Gzadj) */
+  gainMeas1 = readAudioDiagLevel(pProslic,pTstin->audioTest.zerodBm_mVpk);
+
+  /* Bypass TXACHPF and set TXACEQ to unity */
+  gainCfg.acgain = ProSLIC_ReadRAM(pProslic,544);  /* TXACGAIN */
+  gainCfg.aceq_c0 = ProSLIC_ReadRAM(pProslic,540); /* TXACEQ_C0 */
+  gainCfg.aceq_c1 = ProSLIC_ReadRAM(pProslic,541); /* TXACEQ_C1 */
+  gainCfg.aceq_c2 = ProSLIC_ReadRAM(pProslic,542); /* TXACEQ_C2 */
+  gainCfg.aceq_c3 = ProSLIC_ReadRAM(pProslic,543); /* TXACEQ_C3 */
+  ProSLIC_WriteRAM(pProslic,544,0x8000000L);
+  ProSLIC_WriteRAM(pProslic,543,0x0L);
+  ProSLIC_WriteRAM(pProslic,542,0x0L);
+  ProSLIC_WriteRAM(pProslic,541,0x0L);
+  ProSLIC_WriteRAM(pProslic,540,0x8000000L);
+  ProSLIC_WriteReg(pProslic,44,0x18);
+
+  /* Settle */
+  Delay(pProTimer,800);
+
+  /* Read second level measurement (RX level only) */
+  gainMeas2 = readAudioDiagLevel(pProslic,pTstin->audioTest.zerodBm_mVpk);
+
+  /* Adjust txgain if TXACGAIN wasn't unity during gainMeas1 */
+  if(gainCfg.acgain != 0x8000000L)
+  {
+    data = (gainCfg.acgain*10)/134217;
+    gainMeas3 = dBLookup(data);
+  }
+
+  /* Computations */
+  pTstin->audioTest.rxGain.value = gainMeas2 - Pin;
+  pTstin->audioTest.txGain.value = gainMeas1 - gainMeas2 + gainMeas3;
+
+#ifdef ENABLE_DEBUG
+  if( DEBUG_ENABLED(pProslic) )
+  {
+    LOGPRINT("ProSLIC : TestIn : Audio : gainMeas1 = %d\n", (int)gainMeas1);
+    LOGPRINT("ProSLIC : TestIn : Audio : gainMeas2 = %d\n", (int)gainMeas2);
+    LOGPRINT("ProSLIC : TestIn : Audio : gainMeas3 = %d\n", (int)gainMeas3);
+  }
+#endif
+  pTstin->audioTest.testResult = RC_TEST_PASSED;
+  pTstin->audioTest.testResult |= logTest(pProslic,&(pTstin->audioTest.rxGain),
+                                          "RX Path Gain");
+  pTstin->audioTest.testResult |= logTest(pProslic,&(pTstin->audioTest.txGain),
+                                          "TX Path Gain");
+
+
+
+  /*
+  ** Restore
+  */
+
+  /* Need to store/restore all modified reg/RAM */
+  ProSLIC_WriteRAM(pProslic,544,gainCfg.acgain);
+  ProSLIC_WriteRAM(pProslic,540,gainCfg.aceq_c0);
+  ProSLIC_WriteRAM(pProslic,541,gainCfg.aceq_c1);
+  ProSLIC_WriteRAM(pProslic,542,gainCfg.aceq_c2);
+  ProSLIC_WriteRAM(pProslic,543,gainCfg.aceq_c3);
+
+  ProSLIC_WriteReg(pProslic,71,0x0);  /* DIAG1 */
+  ProSLIC_WriteReg(pProslic,44,0x0);  /* DIGCON */
+  ProSLIC_WriteReg(pProslic,48,0x0);  /* OMODE */
+  ProSLIC_WriteReg(pProslic,49,0x0);  /* OCON */
+  ProSLIC_SetLinefeedStatus(pProslic,LF_FWD_ACTIVE);
+  ProSLIC_WriteReg(pProslic,47,enhanceRegSave);
+  ProSLIC_SetLinefeedStatus(pProslic,lf);
+
+  /* Validate last test results */
+  pTstin->audioTest.testDataValid = TSTIN_RESULTS_VALID;
+
+  return pTstin->audioTest.testResult;
+}
+
+
+/* *********************************** */
+
+int ProSLIC_testInPcmLpbkSetup(proslicTestInObjType *pTstin,
+                               proslicPcmLpbkTest *pcmLpbkTest)
+{
+  pTstin->pcmLpbkTest = *pcmLpbkTest;
+  pTstin->pcmLpbkTest.testEnable = 1;
+
+  return RC_NONE;
+}
+
+/* *********************************** */
+
+int ProSLIC_testInDcFeedSetup(proslicTestInObjType *pTstin,
+                              proslicDcFeedTest *dcFeedTest)
+{
+  pTstin->dcFeedTest = *dcFeedTest;
+  pTstin->dcFeedTest.testEnable = 1;
+
+  return RC_NONE;
+}
+
+/* *********************************** */
+
+int ProSLIC_testInRingingSetup(proslicTestInObjType *pTstin,
+                               proslicRingingTest *ringingTest)
+{
+  /* Copy limits per-channel */
+
+  pTstin->ringingTest = *ringingTest;
+  pTstin->ringingTest.testEnable = 1;
+
+  return RC_NONE;
+}
+/* *********************************** */
+
+int ProSLIC_testInBatterySetup(proslicTestInObjType *pTstin,
+                               proslicBatteryTest *batteryTest)
+{
+  /* Copy limits per-channel */
+
+  pTstin->batteryTest = *batteryTest;
+  pTstin->batteryTest.testEnable = 1;
+
+  return RC_NONE;
+}
+
+/* *********************************** */
+
+int ProSLIC_testInAudioSetup(proslicTestInObjType *pTstin,
+                             proslicAudioTest *audioTest)
+{
+  /* Copy limits per-channel */
+
+  pTstin->audioTest = *audioTest;
+  pTstin->audioTest.testEnable = 1;
+
+  return RC_NONE;
+}
+
+
+/* *********************************** */
+int ProSLIC_testInPrintLimits(proslicChanType *pProslic,
+                              proslicTestInObjType *pTstin)
+{
+  /* Valid device check */
+  if(TSTIN_INVALID_PART_NUM)
+  {
+    return RC_UNSUPPORTED_FEATURE;
+  }
+#ifdef ENABLE_DEBUG
+  if( DEBUG_ENABLED(pProslic ) )
+  {
+    LOGPRINT("\n");
+    LOGPRINT("************   Test-In Test Limits **************\n");
+    LOGPRINT("----------------------------------------------------------------\n");
+    LOGPRINT("ProSLIC : Test-In : Limits : vtip_on_min (mv) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedVtipOnhook.lowerLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : vtip_on_max (mv) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedVtipOnhook.upperLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : vring_on_min (mv) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedVringOnhook.lowerLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : vring_on_max (mv) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedVringOnhook.upperLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : vloop_on_min (mv) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedVloopOnhook.lowerLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : vloop_on_max (mv) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedVloopOnhook.upperLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : vbat_on_min (mv) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedVbatOnhook.lowerLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : vbat_on_max (mv) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedVbatOnhook.upperLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : itip_on_min (ua) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedItipOnhook.lowerLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : itip_on_max (ua) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedItipOnhook.upperLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : iring_on_min (ua) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedIringOnhook.lowerLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : iring_on_max (ua) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedIringOnhook.upperLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : iloop_on_min (ua) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedIloopOnhook.lowerLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : iloop_on_max (ua) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedIloopOnhook.upperLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : ilong_on_min (ua) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedIlongOnhook.lowerLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : ilong_on_max (ua) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedIlongOnhook.upperLimit));
+    LOGPRINT("----------------------------------------------------------------\n");
+    LOGPRINT("ProSLIC : Test-In : Limits : vtip_off_min (mv) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedVtipOffhook.lowerLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : vtip_off_max (mv) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedVtipOffhook.upperLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : vring_off_min (mv) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedVringOffhook.lowerLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : vring_off_max (mv) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedVringOffhook.upperLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : vloop_off_min (mv) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedVloopOffhook.lowerLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : vloop_off_max (mv) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedVloopOffhook.upperLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : vbat_off_min (mv) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedVbatOffhook.lowerLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : vbat_off_max (mv) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedVbatOffhook.upperLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : itip_off_min (ua) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedItipOffhook.lowerLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : itip_off_max (ua) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedItipOffhook.upperLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : iring_off_min (ua) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedIringOffhook.lowerLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : iring_off_max (ua) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedIringOffhook.upperLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : iloop_off_min (ua) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedIloopOffhook.lowerLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : iloop_off_max (ua) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedIloopOffhook.upperLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : ilong_off_min (ua) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedIlongOffhook.lowerLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : ilong_off_max (ua) = %d\n",
+             (int)(pTstin->dcFeedTest.dcfeedIlongOffhook.upperLimit));
+    LOGPRINT("----------------------------------------------------------------\n");
+    LOGPRINT("ProSLIC : Test-In : Limits : ringing_vac_min (mv) = %d\n",
+             (int)(pTstin->ringingTest.ringingVac.lowerLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : ringing_vac_max (mv) = %d\n",
+             (int)(pTstin->ringingTest.ringingVac.upperLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : ringing_vdc_min (mv) = %d\n",
+             (int)(pTstin->ringingTest.ringingVdc.lowerLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : ringing_vdc_max (mv) = %d\n",
+             (int)(pTstin->ringingTest.ringingVdc.upperLimit));
+    LOGPRINT("----------------------------------------------------------------\n");
+    LOGPRINT("ProSLIC : Test-In : Limits : battery_vbat_min (mv) = %d\n",
+             (int)(pTstin->batteryTest.vbat.lowerLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : battery_vbat_max (mv) = %d\n",
+             (int)(pTstin->batteryTest.vbat.upperLimit));
+    LOGPRINT("----------------------------------------------------------------\n");
+    LOGPRINT("ProSLIC : Test-In : Limits : audio_txgain_min (mdB) = %d\n",
+             (int)(pTstin->audioTest.txGain.lowerLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : audio_txgain_max (mdB) = %d\n",
+             (int)(pTstin->audioTest.txGain.upperLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : audio_rxgain_min (mdB) = %d\n",
+             (int)(pTstin->audioTest.rxGain.lowerLimit));
+    LOGPRINT("ProSLIC : Test-In : Limits : audio_rxgain_max (mdB) = %d\n",
+             (int)(pTstin->audioTest.rxGain.upperLimit));
+    LOGPRINT("----------------------------------------------------------------\n");
+    LOGPRINT("\n");
+  }
+#else
+  SILABS_UNREFERENCED_PARAMETER(pTstin);
+#endif
+  return RC_NONE;
+}
+
+
+static ProSLIC_DCfeed_Cfg testLoad_DC_Cfg[] =
+{
+  {
+  0x1DC6E1D3L,  /* SLOPE_VLIM */
+  0x1F909679L,   /* SLOPE_RFEED */
+  0x0040A0E0L,   /* SLOPE_ILIM */
+  0x1B8687BBL,  /* SLOPE_DELTA1 */
+  0x1CC4B75DL,  /* SLOPE_DELTA2 */
+  0x05A38633L,   /* V_VLIM (48.000 v) */
+  0x050D2839L,   /* V_RFEED (43.000 v) */
+  0x03FE7F0FL,   /* V_ILIM  (34.000 v) */
+  0x009DAFD9L, /* CONST_RFEED (10.000 mA) */
+  0x0045CBBCL,  /* CONST_ILIM (15.000 mA) */
+  0x002D8D96L,  /* I_VLIM (0.000 mA) */
+  0x005B0AFBL,  /* LCRONHK (10.000 mA) */
+  0x006D4060L,   /* LCROFFHK (12.000 mA) */
+  0x00008000L,   /* LCRDBI (5.000 ms) */
+  0x0048D595L,   /* LONGHITH (8.000 mA) */
+  0x003FBAE2L,  /* LONGLOTH (7.000 mA) */
+  0x00008000L,   /* LONGDBI (5.000 ms) */
+  0x000F0000L,   /* LCRMASK (150.000 ms) */
+  0x00080000L,   /* LCRMASK_POLREV (80.000 ms) */
+  0x00140000L,   /* LCRMASK_STATE (200.000 ms) */
+  0x00140000L,   /* LCRMASK_LINECAP (200.000 ms) */
+  0x01BA5E35L,  /* VCM_OH (27.000 v) */
+  0x0051EB85L,   /* VOV_BAT (5.000 v) */
+  0x00418937L,   /* VOV_GND (4.000 v) */
+  }
+};
+
+/* *********************************** */
+int ProSLIC_testLoadTest(
+  SiVoiceChanType_ptr pProslic, 
+  BOOLEAN is_testStart, 
+  uint32_t timeDelayMsec)
+{
+  static ProSLIC_DCfeed_Cfg dcfeedCfg;
+  static uInt8 digcon_reg_cache;
+
+  TRACEPRINT(pProslic, " channel: %u is_testStart: %u delay = %u",
+    pProslic->channel, 
+    is_testStart,
+    timeOffhookMsec);
+  /* Valid device check */
+
+  if(TSTIN_INVALID_PART_NUM)
+  {
+    return RC_UNSUPPORTED_FEATURE;
+  }
+
+  if( TRUE == is_testStart )
+  {
+    /* Verify line not in use */
+    if(ProSLIC_ReadReg(pProslic,PROSLIC_REG_LCRRTP) & 0x02)  /* LCR */
+    {
+      DEBUG_PRINT(pProslic, "\nLine in Use: %u.\n", pProslic->channel);
+      return RC_LINE_IN_USE;
+    }
+   
+    /* Setup lower ILIM linefeed */
+    ProSLIC_SetLinefeedStatus(pProslic,LF_OPEN);
+    storeDCFeedPreset(pProslic, &dcfeedCfg, 0);
+
+    ProSLIC_DCFeedSetupCfg( pProslic, testLoad_DC_Cfg, 0 ); 
+
+    ProSLIC_SetLinefeedStatus(pProslic,LF_FWD_ACTIVE);
+    Delay(pProTimer,100);
+  
+    /* Connect Test Load to cause LCR interrupt*/
+    setInternalTestLoad(pProslic,1);
+    Delay(pProTimer, timeDelayMsec);
+    DEBUG_PRINT(pProslic, "\n%s: test load on for channel %u\n", 
+      __FUNCTION__, pProslic->channel);
+  
+    /* Disable hybrid circuit for test load loopback */
+    digcon_reg_cache = ProSLIC_ReadReg(pProslic,PROSLIC_REG_DIGCON);
+
+    ProSLIC_WriteReg(pProslic, PROSLIC_REG_DIGCON,
+      digcon_reg_cache |0x10 );
+
+    /* At this point the test load should of caused a LCR interrupt and
+       there is an audio path available. NOTE: there may be some distortion
+       of the audio...
+    */
+    
+  }
+  else
+  {
+    /* Restore hybrid circuit */
+    ProSLIC_WriteReg(pProslic,
+      PROSLIC_REG_DIGCON, digcon_reg_cache );
+ 
+    /* Disconnect Test Load */
+    setInternalTestLoad(pProslic,0);
+    Delay(pProTimer, timeDelayMsec);
+    DEBUG_PRINT(pProslic, "\n%s: test load off for channel %u.\n",
+      __FUNCTION__, pProslic->channel);
+  
+   /* Restore DC Feed */
+   ProSLIC_DCFeedSetupCfg(pProslic, &dcfeedCfg, 0);
+  }
+
+  return RC_NONE;
+}
+
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/src/si3218x_LCCB_constants.c b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/src/si3218x_LCCB_constants.c
new file mode 100644
index 0000000..ad948e9
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/src/si3218x_LCCB_constants.c
@@ -0,0 +1,686 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Si3218x ProSLIC API Configuration Tool Version 4.2.1
+ * Last Updated in API Release: 9.2.0
+ * source XML file: si3218x_LCCB_constants.xml
+ *
+ * Auto generated file from configuration tool.
+ */
+
+
+#include "../inc/proslic.h"
+#include "../inc/si3218x.h"
+
+Si3218x_General_Cfg Si3218x_General_Configuration  = {
+0x72,                       /* DEVICE_KEY */
+BO_DCDC_LCCB,               /* BOM_OPT */
+VDC_4P5_16P0,               /* VDC_RANGE_OPT */
+AUTO_ZCAL_ENABLED,          /* ZCAL_ENABLE */
+BO_STD_BOM,                 /* PM_BOM */
+0x00000000L,                /* DCDC_OITHRESH_LO */
+0x01A00000L,                /* DCDC_OITHRESH_HI */
+0x00A00000L,                /* DCDC_OVTHRESH */
+5000L,                      /* DCDC_UVTHRESH */
+1000L,                      /* DCDC_UVHYST */
+0x00000000L,                /* DCDC_FSW_VTHLO */
+0x00000000L,                /* DCDC_FSW_VHYST */
+0x0048D15BL,                /* P_TH_HVIC */
+0x07FEB800L,                /* COEF_P_HVIC */
+0x00083120L,                /* BAT_HYST */
+0x03D70A20L,                /* VBATH_EXPECT (60.00V) */
+0x06666635L,                /* VBATR_EXPECT (100.00V) */
+0x0FFF0000L,                /* PWRSAVE_TIMER */
+0x01999A00L,                /* OFFHOOK_THRESH */
+0x00F00000L,                /* VBAT_TRACK_MIN */
+0x00F00000L,                /* VBAT_TRACK_MIN_RNG */
+0x0ADD5500L,                /* DCDC_ANA_SCALE */
+0x00800000L,                /* THERM_DBI */
+0x00FFFFFFL,                /* VOV_DCDC_SLOPE */
+0x00A18937L,                /* VOV_DCDC_OS */
+0x00A18937L,                /* VOV_RING_BAT_DCDC */
+0x00E49BA5L,                /* VOV_RING_BAT_MAX */
+0x01018900L,                /* DCDC_VERR */
+0x0080C480L,                /* DCDC_VERR_HYST */
+0x00400000L,                /* PD_UVLO */
+0x00400000L,                /* PD_OVLO */
+0x00200000L,                /* PD_OCLO */
+0x00400000L,                /* PD_SWDRV */
+0x00000000L,                /* DCDC_UVPOL */
+0x00200000L,                /* DCDC_RNGTYPE */
+0x00180000L,                /* DCDC_ANA_TOFF */
+0x00100000L,                /* DCDC_ANA_TONMIN */
+0x012FC000L,                /* DCDC_ANA_TONMAX */
+0x50,                       /* IRQEN1 */
+0x13,                       /* IRQEN2 */
+0x03,                       /* IRQEN3 */
+0x00,                       /* IRQEN4 */
+0x30,                       /* ENHANCE */
+0x3F,                       /* AUTO */
+};
+
+Si3218x_audioGain_Cfg Si3218x_audioGain_Presets [] = {
+{0x1377080L,0, 0x0L, 0x0L, 0x0L, 0x0L},
+{0x80C3180L,0, 0x0L, 0x0L, 0x0L, 0x0L}
+};
+
+Si3218x_Ring_Cfg Si3218x_Ring_Presets[] ={
+{
+/*
+	Loop = 500.0 ft @ 0.044 ohms/ft, REN = 3, Rcpe = 600 ohms
+	Rprot = 54 ohms, Type = LPR, Waveform = SINE
+*/ 
+0x00050000L,	/* RTPER */
+0x07EFE000L,	/* RINGFR (20.000 Hz) */
+0x00209380L,	/* RINGAMP (55.000 vrms)  */
+0x00000000L,	/* RINGPHAS */
+0x00000000L,	/* RINGOF (0.000 vdc) */
+0x15E5200EL,	/* SLOPE_RING (100.000 ohms) */
+0x006C94D6L,	/* IRING_LIM (70.000 mA) */
+0x00522220L,	/* RTACTH (45.357 mA) */
+0x0FFFFFFFL,	/* RTDCTH (450.000 mA) */
+0x00006000L,	/* RTACDB (75.000 ms) */
+0x00006000L,	/* RTDCDB (75.000 ms) */
+0x0051EB82L,	/* VOV_RING_BAT (5.000 v) */
+0x00000000L,	/* VOV_RING_GND (0.000 v) */
+0x05B835EFL,	/* VBATR_EXPECT (89.368 v) */
+0x80,			/* RINGTALO (2.000 s) */
+0x3E,			/* RINGTAHI */
+0x00,			/* RINGTILO (4.000 s) */
+0x7D,			/* RINGTIHI */
+0x00000000L,	/* ADAP_RING_MIN_I */
+0x00003000L,	/* COUNTER_IRING_VAL */
+0x00051EB8L,	/* COUNTER_VTR_VAL */
+0x00000000L,	/* CONST_028 */
+0x00000000L,	/* CONST_032 */
+0x00000000L,	/* CONST_038 */
+0x00000000L,	/* CONST_046 */
+0x00000000L,	/* RRD_DELAY */
+0x00000000L,	/* RRD_DELAY2 */
+0x01893740L,	/* VBAT_TRACK_MIN_RNG */
+0x98,			/* RINGCON */
+0x00,			/* USERSTAT */
+0x02DC1AF7L,	/* VCM_RING (43.434 v) */
+0x02DC1AF7L,	/* VCM_RING_FIXED */
+0x003126E8L,	/* DELTA_VCM */
+0x00200000L,	/* DCDC_RNGTYPE */
+},  /* DEFAULT_RINGING */
+{
+/*
+	Loop = 500.0 ft @ 0.044 ohms/ft, REN = 5, Rcpe = 600 ohms
+	Rprot = 54 ohms, Type = LPR, Waveform = SINE
+*/ 
+0x00050000L,	/* RTPER */
+0x07EFE000L,	/* RINGFR (20.000 Hz) */
+0x001C0AFCL,	/* RINGAMP (45.000 vrms)  */
+0x00000000L,	/* RINGPHAS */
+0x00000000L,	/* RINGOF (0.000 vdc) */
+0x15E5200EL,	/* SLOPE_RING (100.000 ohms) */
+0x006C94D6L,	/* IRING_LIM (70.000 mA) */
+0x0068A9B9L,	/* RTACTH (57.798 mA) */
+0x0FFFFFFFL,	/* RTDCTH (450.000 mA) */
+0x00006000L,	/* RTACDB (75.000 ms) */
+0x00006000L,	/* RTDCDB (75.000 ms) */
+0x0051EB82L,	/* VOV_RING_BAT (5.000 v) */
+0x00000000L,	/* VOV_RING_GND (0.000 v) */
+0x04F7DA57L,	/* VBATR_EXPECT (77.628 v) */
+0x80,			/* RINGTALO (2.000 s) */
+0x3E,			/* RINGTAHI */
+0x00,			/* RINGTILO (4.000 s) */
+0x7D,			/* RINGTIHI */
+0x00000000L,	/* ADAP_RING_MIN_I */
+0x00003000L,	/* COUNTER_IRING_VAL */
+0x00051EB8L,	/* COUNTER_VTR_VAL */
+0x00000000L,	/* CONST_028 */
+0x00000000L,	/* CONST_032 */
+0x00000000L,	/* CONST_038 */
+0x00000000L,	/* CONST_046 */
+0x00000000L,	/* RRD_DELAY */
+0x00000000L,	/* RRD_DELAY2 */
+0x01893740L,	/* VBAT_TRACK_MIN_RNG */
+0x98,			/* RINGCON */
+0x00,			/* USERSTAT */
+0x027BED2BL,	/* VCM_RING (37.564 v) */
+0x027BED2BL,	/* VCM_RING_FIXED */
+0x003126E8L,	/* DELTA_VCM */
+0x00200000L,	/* DCDC_RNGTYPE */
+}   /* RING_F20_45VRMS_0VDC_LPR */
+};
+
+Si3218x_DCfeed_Cfg Si3218x_DCfeed_Presets[] = {
+{
+0x1C8A024CL,	/* SLOPE_VLIM */
+0x1F909679L,	/* SLOPE_RFEED */
+0x0040A0E0L,	/* SLOPE_ILIM */
+0x1D5B21A9L,	/* SLOPE_DELTA1 */
+0x1DD87A3EL,	/* SLOPE_DELTA2 */
+0x05A38633L,	/* V_VLIM (48.000 v) */
+0x050D2839L,	/* V_RFEED (43.000 v) */
+0x03FE7F0FL,	/* V_ILIM  (34.000 v) */
+0x00B4F3C3L,	/* CONST_RFEED (15.000 mA) */
+0x005D0FA6L,	/* CONST_ILIM (20.000 mA) */
+0x002D8D96L,	/* I_VLIM (0.000 mA) */
+0x005B0AFBL,	/* LCRONHK (10.000 mA) */
+0x006D4060L,	/* LCROFFHK (12.000 mA) */
+0x00008000L,	/* LCRDBI (5.000 ms) */
+0x0048D595L,	/* LONGHITH (8.000 mA) */
+0x003FBAE2L,	/* LONGLOTH (7.000 mA) */
+0x00008000L,	/* LONGDBI (5.000 ms) */
+0x000F0000L,	/* LCRMASK (150.000 ms) */
+0x00080000L,	/* LCRMASK_POLREV (80.000 ms) */
+0x00140000L,	/* LCRMASK_STATE (200.000 ms) */
+0x00140000L,	/* LCRMASK_LINECAP (200.000 ms) */
+0x01BA5E35L,	/* VCM_OH (27.000 v) */
+0x0051EB85L,	/* VOV_BAT (5.000 v) */
+0x00418937L,	/* VOV_GND (4.000 v) */
+},  /* DCFEED_48V_20MA */
+{
+0x1C8A024CL,	/* SLOPE_VLIM */
+0x1EE08C11L,	/* SLOPE_RFEED */
+0x0040A0E0L,	/* SLOPE_ILIM */
+0x1C940D71L,	/* SLOPE_DELTA1 */
+0x1DD87A3EL,	/* SLOPE_DELTA2 */
+0x05A38633L,	/* V_VLIM (48.000 v) */
+0x050D2839L,	/* V_RFEED (43.000 v) */
+0x03FE7F0FL,	/* V_ILIM  (34.000 v) */
+0x01241BC9L,	/* CONST_RFEED (15.000 mA) */
+0x0074538FL,	/* CONST_ILIM (25.000 mA) */
+0x002D8D96L,	/* I_VLIM (0.000 mA) */
+0x005B0AFBL,	/* LCRONHK (10.000 mA) */
+0x006D4060L,	/* LCROFFHK (12.000 mA) */
+0x00008000L,	/* LCRDBI (5.000 ms) */
+0x0048D595L,	/* LONGHITH (8.000 mA) */
+0x003FBAE2L,	/* LONGLOTH (7.000 mA) */
+0x00008000L,	/* LONGDBI (5.000 ms) */
+0x000F0000L,	/* LCRMASK (150.000 ms) */
+0x00080000L,	/* LCRMASK_POLREV (80.000 ms) */
+0x00140000L,	/* LCRMASK_STATE (200.000 ms) */
+0x00140000L,	/* LCRMASK_LINECAP (200.000 ms) */
+0x01BA5E35L,	/* VCM_OH (27.000 v) */
+0x0051EB85L,	/* VOV_BAT (5.000 v) */
+0x00418937L,	/* VOV_GND (4.000 v) */
+},  /* DCFEED_48V_25MA */
+{
+0x1E655196L,	/* SLOPE_VLIM */
+0x001904EFL,	/* SLOPE_RFEED */
+0x0040A0E0L,	/* SLOPE_ILIM */
+0x1B4CAD9EL,	/* SLOPE_DELTA1 */
+0x1BB0F47CL,	/* SLOPE_DELTA2 */
+0x05A38633L,	/* V_VLIM (48.000 v) */
+0x043AA4A6L,	/* V_RFEED (36.000 v) */
+0x025977EAL,	/* V_ILIM  (20.000 v) */
+0x0068B19AL,	/* CONST_RFEED (18.000 mA) */
+0x005D0FA6L,	/* CONST_ILIM (20.000 mA) */
+0x002D8D96L,	/* I_VLIM (0.000 mA) */
+0x005B0AFBL,	/* LCRONHK (10.000 mA) */
+0x006D4060L,	/* LCROFFHK (12.000 mA) */
+0x00008000L,	/* LCRDBI (5.000 ms) */
+0x0048D595L,	/* LONGHITH (8.000 mA) */
+0x003FBAE2L,	/* LONGLOTH (7.000 mA) */
+0x00008000L,	/* LONGDBI (5.000 ms) */
+0x000F0000L,	/* LCRMASK (150.000 ms) */
+0x00080000L,	/* LCRMASK_POLREV (80.000 ms) */
+0x00140000L,	/* LCRMASK_STATE (200.000 ms) */
+0x00140000L,	/* LCRMASK_LINECAP (200.000 ms) */
+0x01BA5E35L,	/* VCM_OH (27.000 v) */
+0x0051EB85L,	/* VOV_BAT (5.000 v) */
+0x00418937L,	/* VOV_GND (4.000 v) */
+},  /* DCFEED_PSTN_DET_1 */
+{
+0x1A10433FL,	/* SLOPE_VLIM */
+0x1C206275L,	/* SLOPE_RFEED */
+0x0040A0E0L,	/* SLOPE_ILIM */
+0x1C1F426FL,	/* SLOPE_DELTA1 */
+0x1EB51625L,	/* SLOPE_DELTA2 */
+0x041C91DBL,	/* V_VLIM (35.000 v) */
+0x03E06C43L,	/* V_RFEED (33.000 v) */
+0x038633E0L,	/* V_ILIM  (30.000 v) */
+0x022E5DE5L,	/* CONST_RFEED (10.000 mA) */
+0x005D0FA6L,	/* CONST_ILIM (20.000 mA) */
+0x0021373DL,	/* I_VLIM (0.000 mA) */
+0x005B0AFBL,	/* LCRONHK (10.000 mA) */
+0x006D4060L,	/* LCROFFHK (12.000 mA) */
+0x00008000L,	/* LCRDBI (5.000 ms) */
+0x0048D595L,	/* LONGHITH (8.000 mA) */
+0x003FBAE2L,	/* LONGLOTH (7.000 mA) */
+0x00008000L,	/* LONGDBI (5.000 ms) */
+0x000F0000L,	/* LCRMASK (150.000 ms) */
+0x00080000L,	/* LCRMASK_POLREV (80.000 ms) */
+0x00140000L,	/* LCRMASK_STATE (200.000 ms) */
+0x00140000L,	/* LCRMASK_LINECAP (200.000 ms) */
+0x01BA5E35L,	/* VCM_OH (27.000 v) */
+0x0051EB85L,	/* VOV_BAT (5.000 v) */
+0x00418937L,	/* VOV_GND (4.000 v) */
+}   /* DCFEED_PSTN_DET_2 */
+};
+
+Si3218x_Impedance_Cfg Si3218x_Impedance_Presets[] ={
+/* Source: Database file: cwdb.db */
+/* Database information: */
+/* parameters: zref=600_0_0 rprot=30 rfuse=24 emi_cap=10*/
+{
+{0x07F3A400L, 0x000FF180L, 0x00009380L, 0x1FFDA800L,    /* TXACEQ */
+ 0x07EF1600L, 0x0014B500L, 0x1FFD6580L, 0x1FFCA400L},   /* RXACEQ */
+{0x0008EF00L, 0x00099780L, 0x017DF600L, 0x0096B900L,    /* ECFIR/ECIIR */
+ 0x02549000L, 0x1E4B7D00L, 0x018EEE00L, 0x1EEE0600L,
+ 0x008A8080L, 0x1F713080L, 0x0489BA00L, 0x03592500L},
+{0x0086CE00L, 0x1EF46980L, 0x0084CB00L, 0x0FE34F00L,    /* ZSYNTH */
+ 0x181CA780L, 0x5D}, 
+ 0x08EB8E00L,   /* TXACGAIN */
+ 0x01532100L,   /* RXACGAIN */
+ 0x07AA7180L, 0x18558F00L, 0x0754E300L,    /* RXACHPF */
+#ifdef ENABLE_HIRES_GAIN
+ 0, 0  /* TXGAIN*10, RXGAIN*10 (hi_res) */
+#else
+ 0, 0  /* TXGAIN, RXGAIN */
+#endif
+ },  /* ZSYN_600_0_0_30_0 */
+/* Source: Database file: cwdb.db */
+/* Database information: */
+/* parameters: zref=270_750_150 rprot=30 rfuse=24 emi_cap=10*/
+{
+{0x0750E500L, 0x1FC70280L, 0x000BA980L, 0x1FFD2880L,    /* TXACEQ */
+ 0x0A8E2380L, 0x1B905280L, 0x00847700L, 0x1FDAFA00L},   /* RXACEQ */
+{0x002C8880L, 0x1F630D80L, 0x027F7980L, 0x1F3AD200L,    /* ECFIR/ECIIR */
+ 0x040B8680L, 0x1F414D00L, 0x01427B00L, 0x00208200L,
+ 0x0026AE00L, 0x1FD71680L, 0x0C8EDB00L, 0x1B688A00L},
+{0x1F657980L, 0x0096FE00L, 0x00035500L, 0x0D7FE800L,    /* ZSYNTH */
+ 0x1A7F1A80L, 0xB4}, 
+ 0x08000000L,   /* TXACGAIN */
+ 0x01106B80L,   /* RXACGAIN */
+ 0x07BC8400L, 0x18437C80L, 0x07790880L,    /* RXACHPF */
+#ifdef ENABLE_HIRES_GAIN
+ 0, 0  /* TXGAIN*10, RXGAIN*10 (hi_res) */
+#else
+ 0, 0  /* TXGAIN, RXGAIN */
+#endif
+ },  /* ZSYN_270_750_150_30_0 */
+/* Source: Database file: cwdb.db */
+/* Database information: */
+/* parameters: zref=370_620_310 rprot=30 rfuse=24 emi_cap=10*/
+{
+{0x08363C80L, 0x1FB03200L, 0x1FFBD200L, 0x1FFC7A00L,    /* TXACEQ */
+ 0x0A0D0800L, 0x1BEB0880L, 0x1F9DF080L, 0x1FE07F00L},   /* RXACEQ */
+{0x00236380L, 0x1F947D00L, 0x020DE380L, 0x1FBEED00L,    /* ECFIR/ECIIR */
+ 0x03050300L, 0x1F7D1D00L, 0x010A9F80L, 0x00329D80L,
+ 0x003E4100L, 0x1FC0DF00L, 0x0DAADE80L, 0x1A4F2600L},
+{0x00226100L, 0x1F8EEE80L, 0x004E9D00L, 0x0F0B9B00L,    /* ZSYNTH */
+ 0x18F3E580L, 0x99}, 
+ 0x0808D100L,   /* TXACGAIN */
+ 0x0131BE80L,   /* RXACGAIN */
+ 0x07B5C100L, 0x184A3F80L, 0x076B8200L,    /* RXACHPF */
+#ifdef ENABLE_HIRES_GAIN
+ 0, 0  /* TXGAIN*10, RXGAIN*10 (hi_res) */
+#else
+ 0, 0  /* TXGAIN, RXGAIN */
+#endif
+ },  /* ZSYN_370_620_310_30_0 */
+/* Source: Database file: cwdb.db */
+/* Database information: */
+/* parameters: zref=220_820_120 rprot=30 rfuse=24 emi_cap=10*/
+{
+{0x07194B80L, 0x1FC63800L, 0x0008D280L, 0x1FFC0600L,    /* TXACEQ */
+ 0x0A849680L, 0x1BB04480L, 0x00A4AA00L, 0x1FD3E680L},   /* RXACEQ */
+{0x001B8C00L, 0x1FC65400L, 0x016A5F00L, 0x01323C80L,    /* ECFIR/ECIIR */
+ 0x01DB4980L, 0x01484700L, 0x00258000L, 0x007E9C80L,
+ 0x0016FF00L, 0x1FE69100L, 0x0CE9A400L, 0x1B0EA980L},
+{0x00B3D800L, 0x1D2F8280L, 0x021C8B00L, 0x0A157F00L,    /* ZSYNTH */
+ 0x1DE99E80L, 0xAD}, 
+ 0x08000000L,   /* TXACGAIN */
+ 0x01084680L,   /* RXACGAIN */
+ 0x07BBFA80L, 0x18440600L, 0x0777F580L,    /* RXACHPF */
+#ifdef ENABLE_HIRES_GAIN
+ 0, 0  /* TXGAIN*10, RXGAIN*10 (hi_res) */
+#else
+ 0, 0  /* TXGAIN, RXGAIN */
+#endif
+ },  /* ZSYN_220_820_120_30_0 */
+/* Source: Database file: cwdb.db */
+/* Database information: */
+/* parameters: zref=600_0_0 rprot=30 rfuse=24 emi_cap=10*/
+{
+{0x07F3A400L, 0x000FF180L, 0x00009380L, 0x1FFDA800L,    /* TXACEQ */
+ 0x07EF1600L, 0x0014B500L, 0x1FFD6580L, 0x1FFCA400L},   /* RXACEQ */
+{0x0008EF00L, 0x00099780L, 0x017DF600L, 0x0096B900L,    /* ECFIR/ECIIR */
+ 0x02549000L, 0x1E4B7D00L, 0x018EEE00L, 0x1EEE0600L,
+ 0x008A8080L, 0x1F713080L, 0x0489BA00L, 0x03592500L},
+{0x0086CE00L, 0x1EF46980L, 0x0084CB00L, 0x0FE34F00L,    /* ZSYNTH */
+ 0x181CA780L, 0x5D}, 
+ 0x08EB8E00L,   /* TXACGAIN */
+ 0x01532100L,   /* RXACGAIN */
+ 0x07AA7180L, 0x18558F00L, 0x0754E300L,    /* RXACHPF */
+#ifdef ENABLE_HIRES_GAIN
+ 0, 0  /* TXGAIN*10, RXGAIN*10 (hi_res) */
+#else
+ 0, 0  /* TXGAIN, RXGAIN */
+#endif
+ },  /* ZSYN_600_0_1000_30_0 */
+/* Source: Database file: cwdb.db */
+/* Database information: */
+/* parameters: zref=200_680_100 rprot=30 rfuse=24 emi_cap=10*/
+{
+{0x0778B980L, 0x1FB97E00L, 0x00030780L, 0x1FFC2580L,    /* TXACEQ */
+ 0x09CC0780L, 0x1D104400L, 0x0076CB80L, 0x1FDE3D80L},   /* RXACEQ */
+{0x1FF64C00L, 0x00456280L, 0x00BEC500L, 0x014D3E80L,    /* ECFIR/ECIIR */
+ 0x02EB2B00L, 0x1E983B80L, 0x029EE280L, 0x1E7B7400L,
+ 0x00D19A80L, 0x1F293D80L, 0x06116D00L, 0x01D55C00L},
+{0x01241700L, 0x1CB53A80L, 0x02269400L, 0x0A14BA00L,    /* ZSYNTH */
+ 0x1DE9D080L, 0x99}, 
+ 0x08000000L,   /* TXACGAIN */
+ 0x01152480L,   /* RXACGAIN */
+ 0x07B96C00L, 0x18469480L, 0x0772D800L,    /* RXACHPF */
+#ifdef ENABLE_HIRES_GAIN
+ 0, 0  /* TXGAIN*10, RXGAIN*10 (hi_res) */
+#else
+ 0, 0  /* TXGAIN, RXGAIN */
+#endif
+ },  /* ZSYN_200_680_100_30_0 */
+/* Source: Database file: cwdb.db */
+/* Database information: */
+/* parameters: zref=220_820_115 rprot=30 rfuse=24 emi_cap=10*/
+{
+{0x070AC700L, 0x1FCC7280L, 0x00098700L, 0x1FFCE080L,    /* TXACEQ */
+ 0x0A6A6400L, 0x1BE48B80L, 0x009F3B80L, 0x1FD56000L},   /* RXACEQ */
+{0x00314700L, 0x1F6C1D80L, 0x02347480L, 0x00158B80L,    /* ECFIR/ECIIR */
+ 0x03173D00L, 0x0058E580L, 0x00A6DA80L, 0x004B0780L,
+ 0x001B1300L, 0x1FE2DE80L, 0x0C313180L, 0x1BB7FE00L},
+{0x1FD95980L, 0x1ECDE680L, 0x0156F600L, 0x0A0C9600L,    /* ZSYNTH */
+ 0x1DEBF080L, 0xB4}, 
+ 0x08000000L,   /* TXACGAIN */
+ 0x01069C80L,   /* RXACGAIN */
+ 0x07BECB80L, 0x18413500L, 0x077D9700L,    /* RXACHPF */
+#ifdef ENABLE_HIRES_GAIN
+ 0, 0  /* TXGAIN*10, RXGAIN*10 (hi_res) */
+#else
+ 0, 0  /* TXGAIN, RXGAIN */
+#endif
+ },  /* ZSYN_220_820_115_30_0 */
+/* Source: Database file: cwdb.db */
+/* Database information: */
+/* parameters: zref=600_0_0 rprot=30 rfuse=24 emi_cap=0*/
+{
+{0x081A5300L, 0x1FE00A00L, 0x00071580L, 0x1FFE2600L,    /* TXACEQ */
+ 0x07F9A800L, 0x1FFA7D80L, 0x1FF59E80L, 0x1FFF1400L},   /* RXACEQ */
+{0x0052DC80L, 0x1F455780L, 0x0297A080L, 0x0006D980L,    /* ECFIR/ECIIR */
+ 0x0195DC00L, 0x000E1E80L, 0x1FC53680L, 0x00050800L,
+ 0x00233400L, 0x1FE6DC00L, 0x1FCD1E00L, 0x1FD2FE00L},
+{0x007B9C00L, 0x1F296C80L, 0x005BCD00L, 0x09F07F00L,    /* ZSYNTH */
+ 0x1DF35080L, 0x6F}, 
+ 0x08C2DA80L,   /* TXACGAIN */
+ 0x01495A80L,   /* RXACGAIN */
+ 0x07BECC80L, 0x18413400L, 0x077D9900L,    /* RXACHPF */
+#ifdef ENABLE_HIRES_GAIN
+ 0, 0  /* TXGAIN*10, RXGAIN*10 (hi_res) */
+#else
+ 0, 0  /* TXGAIN, RXGAIN */
+#endif
+ }   /* WB_ZSYN_600_0_0_20_0 */
+};
+
+Si3218x_FSK_Cfg Si3218x_FSK_Presets[] ={
+{
+{
+0x02232000L,	 /* FSK01 */
+0x077C2000L 	 /* FSK10 */
+},
+{
+0x0015C000L,	 /* FSKAMP0 (0.080 vrms )*/
+0x000BA000L 	 /* FSKAMP1 (0.080 vrms) */
+},
+{
+0x06B60000L,	 /* FSKFREQ0 (2200.0 Hz space) */
+0x079C0000L 	 /* FSKFREQ1 (1200.0 Hz mark) */
+},
+0x00,			 /* FSK8 */
+0x00,			 /* FSKDEPTH (1 deep fifo) */
+},  /* DEFAULT_FSK */
+{
+{
+0x026E4000L,	 /* FSK01 */
+0x0694C000L 	 /* FSK10 */
+},
+{
+0x0014C000L,	 /* FSKAMP0 (0.080 vrms )*/
+0x000CA000L 	 /* FSKAMP1 (0.080 vrms) */
+},
+{
+0x06D20000L,	 /* FSKFREQ0 (2100.0 Hz space) */
+0x078B0000L 	 /* FSKFREQ1 (1300.0 Hz mark) */
+},
+0x00,			 /* FSK8 */
+0x00,			 /* FSKDEPTH (1 deep fifo) */
+}   /* ETSI_FSK */
+};
+
+Si3218x_PulseMeter_Cfg Si3218x_PulseMeter_Presets[] ={
+{
+0x007A2B6AL,  /* PM_AMP_THRESH (1.000) */
+0,            /* Freq (12kHz) */ 
+0,            /* PM_AUTO (off)*/
+0x07D00000L,  /* PM_active (2000 ms) */
+0x07D00000L   /* PM_inactive (2000 ms) */
+ }   /* DEFAULT_PULSE_METERING */
+};
+
+Si3218x_Tone_Cfg Si3218x_Tone_Presets[] = {
+{
+	{
+	0x07B30000L,	 /* OSC1FREQ (350.000 Hz) */
+	0x000C6000L,	 /* OSC1AMP (-18.000 dBm) */
+	0x00000000L,	 /* OSC1PHAS (0.000 rad) */
+	0x00,			 /* O1TALO (0 ms) */
+	0x00,			 /* O1TAHI */
+	0x00,			 /* O1TILO (0 ms) */
+	0x00			 /* O1TIHI */
+	},
+	{
+	0x07870000L,	 /* OSC2FREQ (440.000 Hz) */
+	0x000FA000L,	 /* OSC2AMP (-18.000 dBm) */
+	0x00000000L,	 /* OSC2PHAS (0.000 rad) */
+	0x00,			 /* O2TALO (0 ms) */
+	0x00,			 /* O2TAHI */
+	0x00,			 /* O2TILO (0 ms) */
+	0x00 			 /* O2TIHI */
+	},
+	0x66 			 /* OMODE */
+},  /* TONEGEN_FCC_DIAL */
+{
+	{
+	0x07700000L,	 /* OSC1FREQ (480.000 Hz) */
+	0x00112000L,	 /* OSC1AMP (-18.000 dBm) */
+	0x00000000L,	 /* OSC1PHAS (0.000 rad) */
+	0xA0,			 /* O1TALO (500 ms) */
+	0x0F,			 /* O1TAHI */
+	0xA0,			 /* O1TILO (500 ms) */
+	0x0F			 /* O1TIHI */
+	},
+	{
+	0x07120000L,	 /* OSC2FREQ (620.000 Hz) */
+	0x00164000L,	 /* OSC2AMP (-18.000 dBm) */
+	0x00000000L,	 /* OSC2PHAS (0.000 rad) */
+	0xA0,			 /* O2TALO (500 ms) */
+	0x0F,			 /* O2TAHI */
+	0xA0,			 /* O2TILO (500 ms) */
+	0x0F 			 /* O2TIHI */
+	},
+	0x66 			 /* OMODE */
+},  /* TONEGEN_FCC_BUSY */
+{
+	{
+	0x07700000L,	 /* OSC1FREQ (480.000 Hz) */
+	0x00112000L,	 /* OSC1AMP (-18.000 dBm) */
+	0x00000000L,	 /* OSC1PHAS (0.000 rad) */
+	0x80,			 /* O1TALO (2000 ms) */
+	0x3E,			 /* O1TAHI */
+	0x00,			 /* O1TILO (4000 ms) */
+	0x7D			 /* O1TIHI */
+	},
+	{
+	0x07870000L,	 /* OSC2FREQ (440.000 Hz) */
+	0x000FA000L,	 /* OSC2AMP (-18.000 dBm) */
+	0x00000000L,	 /* OSC2PHAS (0.000 rad) */
+	0x80,			 /* O2TALO (2000 ms) */
+	0x3E,			 /* O2TAHI */
+	0x00,			 /* O2TILO (4000 ms) */
+	0x7D 			 /* O2TIHI */
+	},
+	0x66 			 /* OMODE */
+},  /* TONEGEN_FCC_RINGBACK */
+{
+	{
+	0x07700000L,	 /* OSC1FREQ (480.000 Hz) */
+	0x00112000L,	 /* OSC1AMP (-18.000 dBm) */
+	0x00000000L,	 /* OSC1PHAS (0.000 rad) */
+	0x60,			 /* O1TALO (300 ms) */
+	0x09,			 /* O1TAHI */
+	0x60,			 /* O1TILO (300 ms) */
+	0x09			 /* O1TIHI */
+	},
+	{
+	0x07120000L,	 /* OSC2FREQ (620.000 Hz) */
+	0x00164000L,	 /* OSC2AMP (-18.000 dBm) */
+	0x00000000L,	 /* OSC2PHAS (0.000 rad) */
+	0x60,			 /* O2TALO (300 ms) */
+	0x09,			 /* O2TAHI */
+	0x40,			 /* O2TILO (200 ms) */
+	0x06 			 /* O2TIHI */
+	},
+	0x66 			 /* OMODE */
+},  /* TONEGEN_FCC_REORDER */
+{
+	{
+	0x07700000L,	 /* OSC1FREQ (480.000 Hz) */
+	0x00112000L,	 /* OSC1AMP (-18.000 dBm) */
+	0x00000000L,	 /* OSC1PHAS (0.000 rad) */
+	0x40,			 /* O1TALO (200 ms) */
+	0x06,			 /* O1TAHI */
+	0x40,			 /* O1TILO (200 ms) */
+	0x06			 /* O1TIHI */
+	},
+	{
+	0x07120000L,	 /* OSC2FREQ (620.000 Hz) */
+	0x00164000L,	 /* OSC2AMP (-18.000 dBm) */
+	0x00000000L,	 /* OSC2PHAS (0.000 rad) */
+	0x40,			 /* O2TALO (200 ms) */
+	0x06,			 /* O2TAHI */
+	0x40,			 /* O2TILO (200 ms) */
+	0x06 			 /* O2TIHI */
+	},
+	0x66 			 /* OMODE */
+},  /* TONEGEN_FCC_CONGESTION */
+{
+	{
+	0x1F2F0000L,	 /* OSC1FREQ (2130.000 Hz) */
+	0x0063A000L,	 /* OSC1AMP (-18.000 dBm) */
+	0x00000000L,	 /* OSC1PHAS (0.000 rad) */
+	0x80,			 /* O1TALO (80 ms) */
+	0x02,			 /* O1TAHI */
+	0x80,			 /* O1TILO (80 ms) */
+	0x02			 /* O1TIHI */
+	},
+	{
+	0x1B8E0000L,	 /* OSC2FREQ (2750.000 Hz) */
+	0x00A84000L,	 /* OSC2AMP (-18.000 dBm) */
+	0x00000000L,	 /* OSC2PHAS (0.000 rad) */
+	0x80,			 /* O2TALO (80 ms) */
+	0x02,			 /* O2TAHI */
+	0x40,			 /* O2TILO (1000 ms) */
+	0x1F 			 /* O2TIHI */
+	},
+	0x66 			 /* OMODE */
+},  /* TONEGEN_FCC_CAS */
+{
+	{
+	0x07870000L,	 /* OSC1FREQ (440.000 Hz) */
+	0x000FA000L,	 /* OSC1AMP (-18.000 dBm) */
+	0x00000000L,	 /* OSC1PHAS (0.000 rad) */
+	0x60,			 /* O1TALO (300 ms) */
+	0x09,			 /* O1TAHI */
+	0x00,			 /* O1TILO (8000 ms) */
+	0xFA			 /* O1TIHI */
+	},
+	{
+	0x1B8E0000L,	 /* OSC2FREQ (2750.000 Hz) */
+	0x00A84000L,	 /* OSC2AMP (-18.000 dBm) */
+	0x00000000L,	 /* OSC2PHAS (0.000 rad) */
+	0x80,			 /* O2TALO (2000 ms) */
+	0x3E,			 /* O2TAHI */
+	0x00,			 /* O2TILO (4000 ms) */
+	0x7D 			 /* O2TIHI */
+	},
+	0x06 			 /* OMODE */
+},  /* TONEGEN_FCC_SAS */
+{
+	{
+	0x1F2F0000L,	 /* OSC1FREQ (2130.000 Hz) */
+	0x01BD0000L,	 /* OSC1AMP (-5.000 dBm) */
+	0x00000000L,	 /* OSC1PHAS (0.000 rad) */
+	0x20,			 /* O1TALO (100 ms) */
+	0x03,			 /* O1TAHI */
+	0x20,			 /* O1TILO (100 ms) */
+	0x03			 /* O1TIHI */
+	},
+	{
+	0x1B8E0000L,	 /* OSC2FREQ (2750.000 Hz) */
+	0x02EFC000L,	 /* OSC2AMP (-5.000 dBm) */
+	0x00000000L,	 /* OSC2PHAS (0.000 rad) */
+	0x20,			 /* O2TALO (100 ms) */
+	0x03,			 /* O2TAHI */
+	0x20,			 /* O2TILO (100 ms) */
+	0x03 			 /* O2TIHI */
+	},
+	0x66 			 /* OMODE */
+},  /* TONEGEN_ETSI_DTAS */
+{
+	{
+	0x05A40000L,	 /* OSC1FREQ (1004.000 Hz) */
+	0x005DE000L,	 /* OSC1AMP (-10.000 dBm) */
+	0x00000000L,	 /* OSC1PHAS (0.000 rad) */
+	0x00,			 /* O1TALO (8000 ms) */
+	0xFA,			 /* O1TAHI */
+	0x00,			 /* O1TILO (8000 ms) */
+	0xFA			 /* O1TIHI */
+	},
+	{
+	0x07870000L,	 /* OSC2FREQ (440.000 Hz) */
+	0x000FA000L,	 /* OSC2AMP (-18.000 dBm) */
+	0x00000000L,	 /* OSC2PHAS (0.000 rad) */
+	0x80,			 /* O2TALO (2000 ms) */
+	0x3E,			 /* O2TAHI */
+	0x00,			 /* O2TILO (4000 ms) */
+	0x7D 			 /* O2TIHI */
+	},
+	0x47 			 /* OMODE */
+}   /* TONEGEN_1004 */
+};
+
+Si3218x_PCM_Cfg Si3218x_PCM_Presets[] ={
+	{
+	0x01, 	 /* PCM_FMT - u-Law */
+	0x00, 	 /* WIDEBAND - DISABLED (3.4kHz BW) */
+	0x00, 	 /* PCM_TRI - PCLK RISING EDGE */
+	0x00, 	 /* TX_EDGE - PCLK RISING EDGE */
+	0x00 	 /* A-LAW -  INVERT NONE */
+	},  /* PCM_8ULAW */
+	{
+	0x00, 	 /* PCM_FMT - A-Law */
+	0x00, 	 /* WIDEBAND - DISABLED (3.4kHz BW) */
+	0x00, 	 /* PCM_TRI - PCLK RISING EDGE */
+	0x00, 	 /* TX_EDGE - PCLK RISING EDGE */
+	0x00 	 /* A-LAW -  INVERT NONE */
+	},  /* PCM_8ALAW */
+	{
+	0x03, 	 /* PCM_FMT - 16-bit Linear */
+	0x00, 	 /* WIDEBAND - DISABLED (3.4kHz BW) */
+	0x00, 	 /* PCM_TRI - PCLK RISING EDGE */
+	0x00, 	 /* TX_EDGE - PCLK RISING EDGE */
+	0x00 	 /* A-LAW -  INVERT NONE */
+	},  /* PCM_16LIN */
+	{
+	0x03, 	 /* PCM_FMT - 16-bit Linear */
+	0x01, 	 /* WIDEBAND - ENABLED (7kHz BW) */
+	0x00, 	 /* PCM_TRI - PCLK RISING EDGE */
+	0x00, 	 /* TX_EDGE - PCLK RISING EDGE */
+	0x00 	 /* A-LAW -  INVERT NONE */
+	}   /* PCM_16LIN_WB */
+};
+
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/src/si3218x_intf.c b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/src/si3218x_intf.c
new file mode 100644
index 0000000..7b778f5
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/src/si3218x_intf.c
@@ -0,0 +1,3135 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * SI3218X ProSLIC interface implementation file
+ *
+ * Author(s):
+ * cdp
+ *
+ * Distributed by:
+ * Silicon Laboratories, Inc
+ *
+ * This file contains proprietary information.
+ * No dissemination allowed without prior written permission from
+ * Silicon Laboratories, Inc.
+ *
+ */
+
+#include "../config_inc/si_voice_datatypes.h"
+#include "../inc/si_voice_ctrl.h"
+#include "../inc/si_voice_timer_intf.h"
+#include "../inc/proslic.h"
+#include "../inc/si3218x.h"
+#include "../inc/si3218x_intf.h"
+#include "../inc/si3218x_registers.h"
+#include "../config_inc/proslic_api_config.h"
+
+#define SI3218X_IRING_LIM_MAX 0xA00000L   /* 103mA */
+#define SI3218X_REVA   2
+
+#define WriteReg        pProslic->deviceId->ctrlInterface->WriteRegister_fptr
+#define ReadReg         pProslic->deviceId->ctrlInterface->ReadRegister_fptr
+#define pProHW          pProslic->deviceId->ctrlInterface->hCtrl
+#define Reset           pProslic->deviceId->ctrlInterface->Reset_fptr
+#define Delay           pProslic->deviceId->ctrlInterface->Delay_fptr
+#define pProTimer       pProslic->deviceId->ctrlInterface->hTimer
+#define WriteRAM        pProslic->deviceId->ctrlInterface->WriteRAM_fptr
+#define ReadRAM         pProslic->deviceId->ctrlInterface->ReadRAM_fptr
+#define TimeElapsed     pProslic->deviceId->ctrlInterface->timeElapsed_fptr
+#define getTime         pProslic->deviceId->ctrlInterface->getTime_fptr
+
+#define WriteRegX       deviceId->ctrlInterface->WriteRegister_fptr
+#define ReadRegX        deviceId->ctrlInterface->ReadRegister_fptr
+#define pProHWX         deviceId->ctrlInterface->hCtrl
+#define DelayX          deviceId->ctrlInterface->Delay_fptr
+#define pProTimerX      deviceId->ctrlInterface->hTimer
+#define ReadRAMX        deviceId->ctrlInterface->ReadRAM_fptr
+#define WriteRAMX       deviceId->ctrlInterface->WriteRAM_fptr
+
+#define DEVICE_KEY_MIN  0x6E
+#define DEVICE_KEY_MAX  0x77
+
+#ifdef ENABLE_DEBUG
+static const char LOGPRINT_PREFIX[] = "Si3218x: ";
+#endif
+
+/*
+** Externs
+*/
+
+/* General Configuration */
+extern Si3218x_General_Cfg Si3218x_General_Configuration;
+#ifdef SIVOICE_MULTI_BOM_SUPPORT
+extern const proslicPatch SI3218X_PATCH_A;
+extern Si3218x_General_Cfg Si3218x_General_Configuration_MultiBOM[];
+extern int si3218x_genconf_multi_max_preset;
+#else
+extern const proslicPatch SI3218X_PATCH_A_DEFAULT;
+#endif
+
+/* Ringing */
+#ifndef DISABLE_RING_SETUP
+extern Si3218x_Ring_Cfg Si3218x_Ring_Presets[];
+#endif
+
+/* Zsynth */
+#ifndef DISABLE_ZSYNTH_SETUP
+extern Si3218x_Impedance_Cfg Si3218x_Impedance_Presets [];
+#endif
+
+/* Audio Gain Scratch */
+extern Si3218x_audioGain_Cfg Si3218x_audioGain_Presets[];
+
+/* Pulse Metering */
+#ifndef DISABLE_PULSE_SETUP
+extern Si3218x_PulseMeter_Cfg Si3218x_PulseMeter_Presets [];
+#endif
+
+/* PCM */
+#ifndef DISABLE_PCM_SETUP
+extern Si3218x_PCM_Cfg Si3218x_PCM_Presets [];
+#endif
+
+#define SI3218X_RAM_DCDC_DCFF_ENABLE SI3218X_RAM_GENERIC_8
+#define GCONF Si3218x_General_Configuration
+
+/*
+** Constants
+*/
+#define BIT20LSB                       1048576L
+#define OITHRESH_OFFS                  900L
+#define OITHRESH_SCALE                 100L
+#define OVTHRESH_OFFS                  71000
+#define OVTHRESH_SCALE                 3000L
+#define UVTHRESH_OFFS                  4057L
+#define UVTHRESH_SCALE                 187L
+#define UVHYST_OFFS                    548L
+#define UVHYST_SCALE                   47L
+
+/*
+** Local functions are defined first
+*/
+
+/*
+** Function: getChipType
+**
+** Description:
+** Decode ID register to identify chip type
+**
+** Input Parameters:
+** ID register value
+**
+** Return:
+** partNumberType
+*/
+static partNumberType getChipType(uInt8 data)
+{
+  /* For the parts that have a HV variant, we map to the lower voltage version,
+     the actual differences are handled in the constants file
+   */
+
+  const uInt8 partNums[8] =
+  {
+    UNSUPPORTED_PART_NUM, UNSUPPORTED_PART_NUM, UNSUPPORTED_PART_NUM, UNSUPPORTED_PART_NUM,
+    SI32184, SI32182, SI32185, SI32183
+  };
+
+  uInt8 partNum = (data & 0x38) >> 3; /* PART_NUM[2:0] = ID[5:3] */
+
+  return partNums[ partNum ];
+}
+
+int Si3218x_GetChipInfo(proslicChanType_ptr pProslic)
+{
+  uInt8 id;
+  id = ReadReg(pProHW, pProslic->channel, PROSLIC_REG_ID);
+
+  pProslic->deviceId->chipRev = id & 0x7;
+  pProslic->deviceId->chipType = getChipType(id);
+
+  if(pProslic->deviceId->chipType  == UNSUPPORTED_PART_NUM)
+  {
+#ifdef ENABLE_DEBUG
+    LOGPRINT("%sregister 0 read = 0x%02X\n", LOGPRINT_PREFIX, id);
+#endif
+    return RC_SPI_FAIL;
+  }
+  else
+  {
+    return RC_NONE;
+  }
+}
+
+/*
+** Function: Si3218x_ConverterSetup
+**
+** Description:
+** Program revision specific settings before powering converter
+**
+** Specifically, from general parameters and knowledge that this
+** is Si32188x, setup dcff drive, gate drive polarity, and charge pump.
+**
+** Returns:
+** int (error)
+**
+*/
+int Si3218x_ConverterSetup(proslicChanType_ptr pProslic)
+{
+  ramData inv_off;
+
+  /* Option to add a per-channel inversion for maximum flexibility */
+  if(pProslic->dcdc_polarity_invert)
+  {
+    inv_off = 0x100000L;
+  }
+  else
+  {
+    inv_off = 0x0L;
+  }
+
+  switch(Si3218x_General_Configuration.bom_option)
+  {
+    case BO_DCDC_LCQC_5W:
+    case BO_DCDC_LCCB:
+    case BO_DCDC_LCCB110:
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_DCDC_LIFT_EN,
+               0x0L);      /* dcff disabled */
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_DCDC_SWDRV_POL,
+               inv_off);    /* non-inverted */
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_DCDC_CPUMP,
+               0x100000L);   /* Charge pump on */
+      Delay(pProTimer,20); /* Cpump settle */
+      break;
+
+    case BO_DCDC_BUCK_BOOST:
+      /*
+      ** RevC buck-boost designs are identical to RevB - no gate drive,
+      ** dcff enabled, non-inverting (charge pump off)
+      */
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_DCDC_CPUMP,0x0L);
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_DCDC_SWDRV_POL,inv_off);
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_DCDC_LIFT_EN,
+               0x100000L); /* dcff enabled */
+      break;
+
+    default:
+      return RC_DCDC_SETUP_ERR;
+  }
+
+  return RC_NONE;
+}
+
+/*
+** Function: Si3218x_PowerUpConverter
+**
+** Description:
+** Powers all DC/DC converters sequentially with delay to minimize
+** peak power draw on VDC.
+**
+** Returns:
+** int (error)
+**
+*/
+
+int Si3218x_PowerUpConverter(proslicChanType_ptr pProslic)
+{
+  errorCodeType error = RC_DCDC_SETUP_ERR;
+  int32 vbath,vbat;
+  uInt8 reg = 0;
+  int timer = 0;
+
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_CHANNEL_TYPE_ERR;
+  }
+
+  /*
+  ** - powerup digital dc/dc w/ OV clamping and shutdown
+  ** - delay
+  ** - verify no short circuits by looking for vbath/2
+  ** - clear dcdc status
+  ** - switch to analog converter with OV clamping only (no shutdown)
+  ** - select analog dcdc and disable pwrsave
+  ** - delay
+  */
+
+  WriteReg(pProHW,pProslic->channel,SI3218X_REG_LINEFEED,
+           LF_FWD_OHT);  /* Force out of pwrsave mode if called in error */
+  WriteReg(pProHW,pProslic->channel,SI3218X_REG_LINEFEED,
+           LF_OPEN);     /* Ensure open line before powering up converter */
+  reg = ReadReg(pProHW,pProslic->channel,SI3218X_REG_ENHANCE);
+  WriteReg(pProHW,pProslic->channel,SI3218X_REG_ENHANCE,
+           reg&0x07);  /* Disable powersave mode */
+
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_PD_DCDC,
+           0x700000L); /* In case OV or UV previously occurred */
+
+  /*
+  ** Setup converter drive polarity and charge pump enable
+  ** based on bom
+  */
+
+  error = Si3218x_ConverterSetup(pProslic);
+
+  if(error != RC_NONE)
+  {
+    DEBUG_PRINT (pProslic, "%sChannel %d : DCDC initialization failed\n",
+                 LOGPRINT_PREFIX, pProslic->channel);
+    return error;
+  }
+
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_PD_DCDC,0x600000L);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_PD_BIAS,0x200000L);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_PD_HVIC,0x200000L);
+  Delay(pProTimer,50);
+
+  vbath = ReadRAM(pProHW,pProslic->channel,SI3218X_RAM_VBATH_EXPECT);
+  vbat = ReadRAM(pProHW,pProslic->channel,SI3218X_RAM_MADC_VBAT);
+  if(vbat & 0x10000000L)
+  {
+    vbat |= 0xF0000000L;
+  }
+  if(vbat < (vbath / 2))
+  {
+    pProslic->channelEnable = 0;
+    error = RC_VBAT_UP_TIMEOUT;
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_PD_DCDC,
+             0x300000L); /* shutdown converter */
+    DEBUG_PRINT (pProslic,
+                 "%sChannel %d : DCDC Short Circuit Failure - disabling channel\n%sVBAT = %d.%d\n",
+                 LOGPRINT_PREFIX, pProslic->channel, LOGPRINT_PREFIX,
+                 (int)((vbat/SCALE_V_MADC)/1000),
+                 SIVOICE_ABS(((vbat/SCALE_V_MADC) - (vbat/SCALE_V_MADC)/1000*1000)));
+    return error;
+  }
+  else   /* Enable analog converter */
+  {
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_DCDC_STATUS,0L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_PD_DCDC,0x400000L);
+    WriteReg(pProHW,pProslic->channel,SI3218X_REG_ENHANCE,
+             reg);   /* Restore ENHANCE */
+    Delay(pProTimer,50);
+  }
+
+  /*
+  ** - monitor vbat vs expected level (VBATH_EXPECT)
+  */
+  vbath = ReadRAM(pProHW,pProslic->channel,SI3218X_RAM_VBATH_EXPECT);
+  do
+  {
+    vbat = ReadRAM(pProHW,pProslic->channel,SI3218X_RAM_MADC_VBAT);
+    if(vbat & 0x10000000L)
+    {
+      vbat |= 0xF0000000L;
+    }
+    Delay(pProTimer,10);
+  }
+  while((vbat < (vbath - COMP_5V))
+        &&(timer++ < SI3218X_TIMEOUT_DCDC_UP));   /* 2 sec timeout */
+
+  DEBUG_PRINT (pProslic, "%sChannel %d : VBAT Up = %d.%d v\n",
+               LOGPRINT_PREFIX,
+               pProslic->channel,(int)((vbat/SCALE_V_MADC)/1000),
+               SIVOICE_ABS(((vbat/SCALE_V_MADC) - (vbat/SCALE_V_MADC)/1000*1000)));
+  if(timer > SI3218X_TIMEOUT_DCDC_UP)
+  {
+    /* Error handling - shutdown converter, disable channel, set error tag */
+    pProslic->channelEnable = 0;
+    error = RC_VBAT_UP_TIMEOUT;
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_PD_DCDC,
+             0x900000L); /* shutdown converter */
+    DEBUG_PRINT (pProslic, "%sChannel %d : DCDC Power up timeout : Status=0x%08X\n",
+                 LOGPRINT_PREFIX, pProslic->channel, ReadRAM(pProHW,pProslic->channel,
+                     SI3218X_RAM_DCDC_STATUS));
+  }
+
+  return error;
+}
+
+/*
+**
+** PROSLIC INITIALIZATION FUNCTIONS
+**
+*/
+
+/*
+** Function: Si3218x_Init_MultiBOM
+**
+** Description:
+** - probe SPI to establish daisy chain length
+** - load patch
+** - initialize general parameters
+** - calibrate madc
+** - bring up DC/DC converters
+** - calibrate everything except madc & lb
+**
+** Input Parameters:
+** pProslic: pointer to PROSLIC object array
+** fault: error code
+**
+** Return:
+** error code
+*/
+
+#ifdef SIVOICE_MULTI_BOM_SUPPORT
+int Si3218x_Init_MultiBOM (proslicChanType_ptr *pProslic, int size, int preset)
+{
+
+  if(preset < si3218x_genconf_multi_max_preset)
+  {
+    /* Copy selected General Configuration parameters to Std structure */
+    Si3218x_General_Configuration = Si3218x_General_Configuration_MultiBOM[preset];
+  }
+  else
+  {
+    return RC_INVALID_PRESET;
+  }
+  return Si3218x_Init_with_Options(pProslic,size, INIT_NO_OPT);
+}
+#endif
+
+
+/*
+** Function: Si3218x_SelectPatch
+**
+** Select patch based on general parameters
+**
+** Input Parameters:
+** pProslic: pointer to PROSLIC object array
+** fault: error code
+** patch:    Pointer to proslicPatch pointer
+**
+** Return:
+** error code
+*/
+int Si3218x_SelectPatch(proslicChanType_ptr pProslic,
+                        const proslicPatch **patch)
+{
+
+#ifdef SIVOICE_MULTI_BOM_SUPPORT
+  if(Si3218x_General_Configuration.bom_option == BO_DCDC_LCQC_5W
+      || Si3218x_General_Configuration.bom_option == BO_DCDC_LCCB
+      || Si3218x_General_Configuration.bom_option == BO_DCDC_LCCB110
+      || Si3218x_General_Configuration.bom_option == BO_DCDC_BUCK_BOOST)
+  {
+    *patch = &(SI3218X_PATCH_A);
+  }
+  else
+  {
+    DEBUG_PRINT(pProslic, "%sChannel %d : Invalid Patch\n", LOGPRINT_PREFIX,
+                pProslic->channel);
+    pProslic->channelEnable = 0;
+    pProslic->error = RC_INVALID_PATCH;
+    return RC_INVALID_PATCH;
+  }
+#else
+  SILABS_UNREFERENCED_PARAMETER(pProslic);
+  *patch = &(SI3218X_PATCH_A_DEFAULT);
+#endif
+
+  return RC_NONE;
+}
+
+/*
+** Function: Si3218x_GenParamUpdate
+**
+** Update general parameters
+**
+** Input Parameters:
+** pProslic: pointer to PROSLIC object array
+** fault: error code
+**
+** Return:
+** error code
+*/
+
+int Si3218x_GenParamUpdate(proslicChanType_ptr pProslic,initSeqType seq)
+{
+  ramData ram_data;
+  uInt8 data;
+
+  switch(seq)
+  {
+    case INIT_SEQ_PRE_CAL:
+      /*
+      ** Force pwrsave off and disable AUTO-tracking - set to user configured state after cal
+      */
+      WriteReg(pProHW, pProslic->channel,SI3218X_REG_ENHANCE,0);
+      WriteReg(pProHW, pProslic->channel,SI3218X_REG_AUTO,0x2F);
+
+      /*
+      ** General Parameter Updates
+      */
+
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_P_TH_HVIC,
+               Si3218x_General_Configuration.p_th_hvic);
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_COEF_P_HVIC,
+               Si3218x_General_Configuration.coef_p_hvic);
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_BAT_HYST,
+               Si3218x_General_Configuration.bat_hyst);
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_VBATH_EXPECT,
+               Si3218x_General_Configuration.vbath_expect);
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_VBATR_EXPECT,
+               Si3218x_General_Configuration.vbatr_expect);
+
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_PWRSAVE_TIMER,
+               Si3218x_General_Configuration.pwrsave_timer);
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_OFFHOOK_THRESH,
+               Si3218x_General_Configuration.pwrsave_ofhk_thresh);
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_VBAT_TRACK_MIN,
+               Si3218x_General_Configuration.vbat_track_min);
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_VBAT_TRACK_MIN_RNG,
+               Si3218x_General_Configuration.vbat_track_min_rng);
+
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_THERM_DBI,
+               Si3218x_General_Configuration.therm_dbi);
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_VOV_DCDC_SLOPE,
+               Si3218x_General_Configuration.vov_dcdc_slope);
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_VOV_DCDC_OS,
+               Si3218x_General_Configuration.vov_dcdc_os);
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_VOV_RING_BAT_MAX,
+               Si3218x_General_Configuration.vov_ring_bat_max);
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_DCDC_VERR,
+               Si3218x_General_Configuration.dcdc_verr);
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_DCDC_VERR_HYST,
+               Si3218x_General_Configuration.dcdc_verr_hyst);
+
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_PD_UVLO,
+               Si3218x_General_Configuration.pd_uvlo);
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_PD_OVLO,
+               Si3218x_General_Configuration.pd_ovlo);
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_PD_OCLO,
+               Si3218x_General_Configuration.pd_oclo);
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_PD_SWDRV,
+               Si3218x_General_Configuration.pd_swdrv);
+
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_DCDC_UVPOL,
+               Si3218x_General_Configuration.dcdc_uvpol);
+
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_DCDC_RNGTYPE,
+               Si3218x_General_Configuration.dcdc_rngtype);
+
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_DCDC_ANA_TOFF,
+               Si3218x_General_Configuration.dcdc_ana_toff);
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_DCDC_ANA_TONMIN,
+               Si3218x_General_Configuration.dcdc_ana_tonmin);
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_DCDC_ANA_TONMAX,
+               Si3218x_General_Configuration.dcdc_ana_tonmax);
+
+
+      /*
+      ** Hardcoded RAM
+      */
+
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_DCDC_OITHRESH_LO,
+               GCONF.i_oithresh_lo);
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_DCDC_OITHRESH_HI,
+               GCONF.i_oithresh_hi);
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_DCDC_OVTHRESH,GCONF.v_ovthresh);
+
+      ram_data = (GCONF.v_uvthresh > UVTHRESH_OFFS)?(GCONF.v_uvthresh -
+                 UVTHRESH_OFFS)/UVTHRESH_SCALE:0L;
+      ram_data *= BIT20LSB;
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_DCDC_UVTHRESH,ram_data);
+
+      ram_data = (GCONF.v_uvhyst > UVHYST_OFFS)?(GCONF.v_uvhyst -
+                 UVHYST_OFFS)/UVHYST_SCALE:0L;
+      ram_data *= BIT20LSB;
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_DCDC_UVHYST,ram_data);
+
+      /* Set default audio gain based on PM bom */
+      if(Si3218x_General_Configuration.pm_bom == BO_PM_BOM)
+      {
+        WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_SCALE_KAUDIO,BOM_KAUDIO_PM);
+        WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_AC_ADC_GAIN,BOM_AC_ADC_GAIN_PM);
+      }
+      else
+      {
+        WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_SCALE_KAUDIO,BOM_KAUDIO_NO_PM);
+        WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_AC_ADC_GAIN,
+                 BOM_AC_ADC_GAIN_NO_PM);
+      }
+
+      /*
+      ** Hardcoded changes to default settings
+      */
+      data = ReadReg(pProHW, pProslic->channel,SI3218X_REG_GPIO_CFG1);
+      data &= 0xF9;  /* Clear DIR for GPIO 1&2 */
+      data |= 0x60;  /* Set ANA mode for GPIO 1&2 */
+      WriteReg(pProHW,pProslic->channel,SI3218X_REG_GPIO_CFG1,
+               data);          /* coarse sensors analog mode */
+      WriteReg(pProHW,pProslic->channel,SI3218X_REG_PDN,
+               0x80);                /* madc powered in open state */
+      WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACHPF_A1_1,
+               0x71EB851L); /* Fix HPF corner */
+      WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_PD_REF_OSC,
+               0x200000L);    /* PLL freerun workaround */
+      WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_ILOOPLPF,
+               0x4EDDB9L);      /* 20pps pulse dialing enhancement */
+      WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_ILONGLPF,
+               0x806D6L);       /* 20pps pulse dialing enhancement */
+      WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_VDIFFLPF,
+               0x10038DL);      /* 20pps pulse dialing enhancement */
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_DCDC_VREF_CTRL,0x0L);
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_VCM_TH,0x106240L);
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_VCMLPF,0x10059FL);
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_CM_SPEEDUP_TIMER,0x0F0000);
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_VCM_HYST,0x206280L);
+
+      /* Prevent Ref Osc from powering down in PLL Freerun mode (pd_ref_osc) */
+      ram_data = ReadRAM(pProHW, pProslic->channel,SI3218X_RAM_PWRSAVE_CTRL_LO);
+      WriteRAM(pProHW, pProslic->channel,SI3218X_RAM_PWRSAVE_CTRL_LO,
+               ram_data&0x07FFFFFFL); /* clear b27 */
+      break;
+
+
+    case INIT_SEQ_POST_CAL:
+      WriteReg(pProHW, pProslic->channel,SI3218X_REG_ENHANCE,
+               Si3218x_General_Configuration.enhance&0x1F);
+      WriteReg(pProHW, pProslic->channel,SI3218X_REG_AUTO,
+               Si3218x_General_Configuration.auto_reg);
+      if(Si3218x_General_Configuration.zcal_en)
+      {
+        WriteReg(pProHW,pProslic->channel, SI3218X_REG_ZCAL_EN, 0x04);
+      }
+      break;
+
+    default:
+      break;
+  }
+  return RC_NONE;
+}
+
+/*
+** Function: Si3218x_Init_with_Options
+**
+** Description:
+** - probe SPI to establish daisy chain length
+** - load patch
+** - initialize general parameters
+** - calibrate madc
+** - bring up DC/DC converters
+** - calibrate everything except madc & lb
+**
+** Input Parameters:
+** pProslic: pointer to PROSLIC object array
+** fault: error code
+**
+** Return:
+** error code
+*/
+
+int Si3218x_Init_with_Options (proslicChanType_ptr *pProslic, int size,
+                               initOptionsType init_opt)
+{
+  /*
+   ** This function will initialize the chipRev and chipType members in pProslic
+   ** as well as load the initialization structures.
+   */
+
+  uInt8 data;
+  uInt8 calSetup[] = {0x00, 0x00, 0x01, 0x80};  /* CALR0-CALR3 */
+  int k, device_count;
+  const proslicPatch *patch;
+  uInt8 status;
+
+  LOGPRINT("%s(%d) size = %d init_opt = %d\n", __FUNCTION__, __LINE__, size,
+           init_opt);
+  /*
+  **
+  ** First qualify general parameters by identifying valid device key.  This
+  ** will prevent inadvertent use of other device's preset files, which could
+  ** lead to improper initialization and high current states.
+  */
+
+  data = Si3218x_General_Configuration.device_key;
+
+  if((data < DEVICE_KEY_MIN)||(data > DEVICE_KEY_MAX))
+  {
+    pProslic[0]->error = RC_INVALID_GEN_PARAM;
+    return pProslic[0]->error;
+  }
+
+  /* reset error code */
+  for(k = 0; k < size; k++)
+  {
+    pProslic[k]->error = RC_NONE;
+  }
+
+  if( (init_opt == INIT_REINIT) || (init_opt == INIT_SOFTRESET) )
+  {
+    ProSLIC_ReInit_helper(pProslic, size, init_opt, SI3218X_CHAN_PER_DEVICE);
+
+   /* for single channel devices, we need do a full restore.. */
+    if(init_opt == INIT_REINIT)
+    {
+      init_opt = 0;
+    }
+}
+
+  if( init_opt != INIT_REINIT )
+  {
+    if( (SiVoice_IdentifyChannels(pProslic, size, &device_count, NULL) != RC_NONE)
+        ||(device_count == 0) )
+    {
+      DEBUG_PRINT(*pProslic, "%s: failed to detect any ProSLICs\n", LOGPRINT_PREFIX);
+      return RC_SPI_FAIL;
+    }
+
+    /*
+     ** Probe each channel and enable all channels that respond
+     */
+    for (k=0; k<size; k++)
+    {
+      if ((pProslic[k]->channelEnable)
+          &&(pProslic[k]->channelType == PROSLIC))
+      {
+        if ( (ProSLIC_VerifyMasterStat(pProslic[k]) != RC_NONE)
+             || (ProSLIC_VerifyControlInterface(pProslic[k]) != RC_NONE) )
+        {
+          pProslic[k]->channelEnable = 0;
+          pProslic[k]->error = RC_SPI_FAIL;
+          DEBUG_PRINT(*pProslic, "%s: SPI communications or PCLK/FS failure\n", LOGPRINT_PREFIX);
+          return pProslic[k]->error;    /* Halt init if SPI fail */
+        }
+      }
+    }
+  } /* init_opt !REINIT */
+
+
+  if( (init_opt != INIT_NO_PATCH_LOAD )  && (init_opt != INIT_REINIT) )
+  {
+    /*
+    ** Load patch (load on every channel since single channel device)
+    */
+    for (k=0; k<size; k++)
+    {
+      if ((pProslic[k]->channelEnable)&&(pProslic[k]->channelType == PROSLIC))
+      {
+
+        /* Select Patch*/
+        if (pProslic[k]->deviceId->chipRev == SI3218X_REVA )
+        {
+          status = (uInt8) Si3218x_SelectPatch(pProslic[k],&patch);
+        }
+        else
+        {
+          DEBUG_PRINT(pProslic[k], "%sChannel %d : Unsupported Device Revision (%d)\n",
+                      LOGPRINT_PREFIX, pProslic[k]->channel,pProslic[k]->deviceId->chipRev );
+          pProslic[k]->channelEnable = 0;
+          pProslic[k]->error = RC_UNSUPPORTED_DEVICE_REV;
+          return RC_UNSUPPORTED_DEVICE_REV;
+        }
+
+        data = 1; /* Use this as a flag to see if we need to load the patch */
+        /* If the patch doesn't match, we need to do a full init, change settings */
+        if(init_opt == INIT_SOFTRESET)
+        {
+          ramData patchData;
+          patchData = pProslic[k]->ReadRAMX(pProslic[k]->pProHWX, pProslic[k]->channel,
+                                            PROSLIC_RAM_PATCHID);
+
+          if( patchData ==  patch->patchSerial)
+          {
+            data = 0;
+          }
+          else
+          {
+            init_opt = INIT_NO_OPT;
+          }
+        } /* SOFTRESET */
+     
+        /* Load Patch */
+        if(status == RC_NONE)
+        {
+          if(data == 1)
+          {
+            Si3218x_LoadPatch(pProslic[k],patch);
+#ifndef DISABLE_VERIFY_PATCH
+            /* Optional Patch Verification */
+            data = (uInt8)Si3218x_VerifyPatch(pProslic[k],patch);
+            if (data != RC_NONE)
+            {
+              DEBUG_PRINT(pProslic[k], "%sChannel %d : Patch verification failed (%d)\n", 
+                   LOGPRINT_PREFIX, k, data);
+              pProslic[k]->channelEnable=0;
+              pProslic[k]->error = RC_PATCH_ERR;
+              return data;
+            }
+#endif
+          }
+        }
+        else
+        {
+          return status;
+        }
+      } /* channel == PROSLIC */
+    } /* for all channles */
+  }/* init_opt  - need to reload patch */
+
+  /*
+  ** Load general parameters - includes all BOM dependencies
+  */
+  if(init_opt != INIT_SOFTRESET)
+  {
+    for (k=0; k<size; k++)
+    {
+      if ((pProslic[k]->channelEnable)&&(pProslic[k]->channelType == PROSLIC))
+      {
+        Si3218x_GenParamUpdate(pProslic[k],INIT_SEQ_PRE_CAL);
+      }
+
+      pProslic[k]->WriteRAMX(pProslic[k]->pProHWX,pProslic[k]->channel,
+                             SI3218X_RAM_IRING_LIM,SI3218X_IRING_LIM_MAX);
+    }
+  }
+
+  if((init_opt != INIT_NO_CAL)
+      && (init_opt != INIT_SOFTRESET)) /* Must recal on single channel devices */
+  {
+    /*
+    ** Calibrate (madc offset)
+    */
+    ProSLIC_Calibrate(pProslic,size,calSetup,TIMEOUT_MADC_CAL);
+  }/* init_opt */
+
+  /*
+  ** Bring up DC/DC converters sequentially to minimize
+  ** peak power demand on VDC
+  */
+  for (k=0; k<size; k++)
+  {
+    if ((pProslic[k]->channelEnable)&&(pProslic[k]->channelType == PROSLIC))
+    {
+      pProslic[k]->error = Si3218x_PowerUpConverter(pProslic[k]);
+    }
+  }
+
+  if((init_opt != INIT_NO_CAL) && (init_opt != INIT_SOFTRESET))
+  {
+    /*
+    ** Calibrate remaining cals (except madc, lb)
+    */
+    calSetup[1] = SI3218X_CAL_STD_CALR1;
+    calSetup[2] = SI3218X_CAL_STD_CALR2;
+
+    ProSLIC_Calibrate(pProslic,size,calSetup,TIMEOUT_GEN_CAL);
+  }
+
+  /*
+  ** Apply post calibration general parameters
+  */
+  if(init_opt != INIT_SOFTRESET)
+  {
+    for (k=0; k<size; k++)
+    {
+
+      if ((pProslic[k]->channelEnable)&&(pProslic[k]->channelType == PROSLIC))
+      {
+        Si3218x_GenParamUpdate(pProslic[k],INIT_SEQ_POST_CAL);
+      }
+    }
+  }
+
+  /* Restore linefeed state after initialization for REINIT/SOFTRESET */
+  if( (init_opt == INIT_REINIT) || (init_opt == INIT_SOFTRESET) )
+  {
+    for(k = 0; k < size; k++)
+    {
+      pProslic[k]->WriteRegX(pProslic[k]->pProHWX,pProslic[k]->channel,
+                             SI3218X_REG_LINEFEED,pProslic[k]->scratch);
+    }
+  }
+
+  /*
+  ** If any channel incurred a non-fatal error, return
+  ** RC_NON_FATAL_INIT_ERR to trigger user to read each channel's
+  ** error status
+  */
+  for (k=0; k<size; k++)
+  {
+    if(pProslic[k]->error != RC_NONE)
+    {
+      return RC_NON_FATAL_INIT_ERR;
+    }
+  }
+
+  return RC_NONE;
+}
+
+/*
+** Function: Si3218x_EnableInterrupts
+**
+** Description:
+** Enables interrupts
+**
+** Input Parameters:
+** pProslic:   pointer to PROSLIC channel obj
+**
+** Returns:
+** 0
+*/
+
+int Si3218x_EnableInterrupts (proslicChanType_ptr pProslic)
+{
+  uInt8 i;
+#ifdef GCI_MODE
+  uInt8 data;
+#endif
+  /* Clear pending interrupts first */
+  for(i = SI3218X_REG_IRQ1; i < SI3218X_REG_IRQ4; i++)
+  {
+#ifdef GCI_MODE
+    data = ReadReg(pProHW,pProslic->channel, i);
+    WriteReg(pProHW,pProslic->channel,i,data); /*clear interrupts (gci only)*/
+#else
+    (void)ReadReg(pProHW,pProslic->channel, i);
+#endif
+
+  }
+
+  WriteReg (pProHW,pProslic->channel,SI3218X_REG_IRQEN1,
+            Si3218x_General_Configuration.irqen1);
+  WriteReg (pProHW,pProslic->channel,SI3218X_REG_IRQEN2,
+            Si3218x_General_Configuration.irqen2);
+  WriteReg (pProHW,pProslic->channel,SI3218X_REG_IRQEN3,
+            Si3218x_General_Configuration.irqen3);
+  WriteReg (pProHW,pProslic->channel,SI3218X_REG_IRQEN4,
+            Si3218x_General_Configuration.irqen4);
+
+  return RC_NONE;
+}
+
+/*
+**
+** PROSLIC CONFIGURATION FUNCTIONS
+**
+*/
+
+/*
+** Function: Si3218x_RingSetup
+**
+** Description:
+** configure ringing
+**
+** Input Parameters:
+** pProslic:   pointer to PROSLIC channel obj
+** preset:     ring preset
+**
+** Returns:
+** 0
+*/
+
+#ifndef DISABLE_RING_SETUP
+int Si3218x_RingSetup (proslicChanType *pProslic, int preset)
+{
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_CHANNEL_TYPE_ERR;
+  }
+
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RTPER,
+           Si3218x_Ring_Presets[preset].rtper);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RINGFR,
+           Si3218x_Ring_Presets[preset].freq);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RINGAMP,
+           Si3218x_Ring_Presets[preset].amp);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RINGPHAS,
+           Si3218x_Ring_Presets[preset].phas);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RINGOF,
+           Si3218x_Ring_Presets[preset].offset);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_SLOPE_RING,
+           Si3218x_Ring_Presets[preset].slope_ring);
+
+  if(Si3218x_Ring_Presets[preset].iring_lim > SI3218X_IRING_LIM_MAX)
+  {
+    Si3218x_Ring_Presets[preset].iring_lim = SI3218X_IRING_LIM_MAX;
+  }
+
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_IRING_LIM,
+           Si3218x_Ring_Presets[preset].iring_lim);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RTACTH,
+           Si3218x_Ring_Presets[preset].rtacth);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RTDCTH,
+           Si3218x_Ring_Presets[preset].rtdcth);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RTACDB,
+           Si3218x_Ring_Presets[preset].rtacdb);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RTDCDB,
+           Si3218x_Ring_Presets[preset].rtdcdb);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_VOV_RING_BAT,
+           Si3218x_Ring_Presets[preset].vov_ring_bat);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_VOV_RING_GND,
+           Si3218x_Ring_Presets[preset].vov_ring_gnd);
+
+#ifndef NOCLAMP_VBATR
+  /* Always limit VBATR_EXPECT to the general configuration maximum */
+  if(Si3218x_Ring_Presets[preset].vbatr_expect >
+      Si3218x_General_Configuration.vbatr_expect)
+  {
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_VBATR_EXPECT,
+             Si3218x_General_Configuration.vbatr_expect);
+    DEBUG_PRINT(pProslic,
+                "%sRingSetup : VBATR_EXPECT : Clamped to Gen Conf Limit\n",LOGPRINT_PREFIX);
+  }
+  else
+  {
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_VBATR_EXPECT,
+             Si3218x_Ring_Presets[preset].vbatr_expect);
+  }
+
+#else
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_VBATR_EXPECT,
+           Si3218x_Ring_Presets[preset].vbatr_expect);
+#endif
+
+
+  WriteReg(pProHW,pProslic->channel,SI3218X_REG_RINGTALO,
+           Si3218x_Ring_Presets[preset].talo);
+  WriteReg(pProHW,pProslic->channel,SI3218X_REG_RINGTAHI,
+           Si3218x_Ring_Presets[preset].tahi);
+  WriteReg(pProHW,pProslic->channel,SI3218X_REG_RINGTILO,
+           Si3218x_Ring_Presets[preset].tilo);
+  WriteReg(pProHW,pProslic->channel,SI3218X_REG_RINGTIHI,
+           Si3218x_Ring_Presets[preset].tihi);
+
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_VBAT_TRACK_MIN_RNG,
+           Si3218x_Ring_Presets[preset].dcdc_vref_min_rng);
+
+  /*
+  ** LPR Handler
+  **
+  ** If USERSTAT == 0x01, adjust RINGCON and clear USERSTAT
+  */
+  if (Si3218x_Ring_Presets[preset].userstat == 0x01)
+  {
+    WriteReg(pProHW,pProslic->channel,SI3218X_REG_RINGCON,
+             (0x80|Si3218x_Ring_Presets[preset].ringcon) & ~(0x40));
+    WriteReg(pProHW,pProslic->channel,SI3218X_REG_USERSTAT,0x00);
+  }
+  else
+  {
+    WriteReg(pProHW,pProslic->channel,SI3218X_REG_RINGCON,
+             Si3218x_Ring_Presets[preset].ringcon);
+    WriteReg(pProHW,pProslic->channel,SI3218X_REG_USERSTAT,
+             Si3218x_Ring_Presets[preset].userstat);
+  }
+
+
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_VCM_RING,
+           Si3218x_Ring_Presets[preset].vcm_ring);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_VCM_RING_FIXED,
+           Si3218x_Ring_Presets[preset].vcm_ring_fixed);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_DELTA_VCM,
+           Si3218x_Ring_Presets[preset].delta_vcm);
+
+
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_DCDC_RNGTYPE,
+           Si3218x_Ring_Presets[preset].dcdc_rngtype);
+
+
+  /*
+  ** If multi bom supported **AND** a buck boost converter
+  ** is being used, force dcdc_rngtype to be fixed.
+  */
+#ifdef SIVOICE_MULTI_BOM_SUPPORT
+#define DCDC_RNGTYPE_BKBT     0L
+  /* Automatically adjust DCDC_RNGTYPE */
+  if(Si3218x_General_Configuration.bom_option == BO_DCDC_BUCK_BOOST)
+  {
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_DCDC_RNGTYPE,DCDC_RNGTYPE_BKBT);
+  }
+#endif
+
+
+  return RC_NONE;
+}
+#endif
+
+/*
+** Function: PROSLIC_ZsynthSetup
+**
+** Description:
+** configure impedance synthesis
+*/
+
+#ifndef DISABLE_ZSYNTH_SETUP
+int Si3218x_ZsynthSetup (proslicChanType *pProslic, int preset)
+{
+  uInt8 lf;
+  uInt8 cal_en = 0;
+  uInt16 timer = 500;
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_CHANNEL_TYPE_ERR;
+  }
+
+  lf = ReadReg(pProHW,pProslic->channel,SI3218X_REG_LINEFEED);
+  WriteReg(pProHW,pProslic->channel,SI3218X_REG_LINEFEED,0);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACEQ_C0,
+           Si3218x_Impedance_Presets[preset].audioEQ.txaceq_c0);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACEQ_C1,
+           Si3218x_Impedance_Presets[preset].audioEQ.txaceq_c1);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACEQ_C2,
+           Si3218x_Impedance_Presets[preset].audioEQ.txaceq_c2);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACEQ_C3,
+           Si3218x_Impedance_Presets[preset].audioEQ.txaceq_c3);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACEQ_C0,
+           Si3218x_Impedance_Presets[preset].audioEQ.rxaceq_c0);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACEQ_C1,
+           Si3218x_Impedance_Presets[preset].audioEQ.rxaceq_c1);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACEQ_C2,
+           Si3218x_Impedance_Presets[preset].audioEQ.rxaceq_c2);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACEQ_C3,
+           Si3218x_Impedance_Presets[preset].audioEQ.rxaceq_c3);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_ECFIR_C2,
+           Si3218x_Impedance_Presets[preset].hybrid.ecfir_c2);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_ECFIR_C3,
+           Si3218x_Impedance_Presets[preset].hybrid.ecfir_c3);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_ECFIR_C4,
+           Si3218x_Impedance_Presets[preset].hybrid.ecfir_c4);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_ECFIR_C5,
+           Si3218x_Impedance_Presets[preset].hybrid.ecfir_c5);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_ECFIR_C6,
+           Si3218x_Impedance_Presets[preset].hybrid.ecfir_c6);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_ECFIR_C7,
+           Si3218x_Impedance_Presets[preset].hybrid.ecfir_c7);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_ECFIR_C8,
+           Si3218x_Impedance_Presets[preset].hybrid.ecfir_c8);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_ECFIR_C9,
+           Si3218x_Impedance_Presets[preset].hybrid.ecfir_c9);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_ECIIR_B0,
+           Si3218x_Impedance_Presets[preset].hybrid.ecfir_b0);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_ECIIR_B1,
+           Si3218x_Impedance_Presets[preset].hybrid.ecfir_b1);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_ECIIR_A1,
+           Si3218x_Impedance_Presets[preset].hybrid.ecfir_a1);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_ECIIR_A2,
+           Si3218x_Impedance_Presets[preset].hybrid.ecfir_a2);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_ZSYNTH_A1,
+           Si3218x_Impedance_Presets[preset].zsynth.zsynth_a1);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_ZSYNTH_A2,
+           Si3218x_Impedance_Presets[preset].zsynth.zsynth_a2);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_ZSYNTH_B1,
+           Si3218x_Impedance_Presets[preset].zsynth.zsynth_b1);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_ZSYNTH_B0,
+           Si3218x_Impedance_Presets[preset].zsynth.zsynth_b0);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_ZSYNTH_B2,
+           Si3218x_Impedance_Presets[preset].zsynth.zsynth_b2);
+  WriteReg(pProHW,pProslic->channel,SI3218X_REG_RA,
+           Si3218x_Impedance_Presets[preset].zsynth.ra);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACGAIN,
+           Si3218x_Impedance_Presets[preset].txgain);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACGAIN_SAVE,
+           Si3218x_Impedance_Presets[preset].rxgain);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACGAIN,
+           Si3218x_Impedance_Presets[preset].rxgain);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACHPF_B0_1,
+           Si3218x_Impedance_Presets[preset].rxachpf_b0_1);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACHPF_B1_1,
+           Si3218x_Impedance_Presets[preset].rxachpf_b1_1);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACHPF_A1_1,
+           Si3218x_Impedance_Presets[preset].rxachpf_a1_1);
+
+  /*
+  ** Scale based on desired gain plan
+  */
+  Si3218x_dbgSetTXGain(pProslic,Si3218x_Impedance_Presets[preset].txgain_db,
+                       preset,TXACGAIN_SEL);
+  Si3218x_dbgSetRXGain(pProslic,Si3218x_Impedance_Presets[preset].rxgain_db,
+                       preset,RXACGAIN_SEL);
+  Si3218x_TXAudioGainSetup(pProslic,TXACGAIN_SEL);
+  Si3218x_RXAudioGainSetup(pProslic,RXACGAIN_SEL);
+
+  /*
+  ** Perform Zcal in case OHT used (eg. no offhook event to trigger auto Zcal)
+  */
+  WriteReg(pProHW,pProslic->channel,SI3218X_REG_CALR0,0x00);
+  WriteReg(pProHW,pProslic->channel,SI3218X_REG_CALR1,0x40);
+  WriteReg(pProHW,pProslic->channel,SI3218X_REG_CALR2,0x00);
+  WriteReg(pProHW,pProslic->channel,SI3218X_REG_CALR3,0x80);  /* start cal */
+
+  /* Wait for zcal to finish */
+  do
+  {
+    cal_en = ReadReg(pProHW,pProslic->channel,SI3218X_REG_CALR3);
+    Delay(pProTimer,1);
+    timer--;
+  }
+  while((cal_en&0x80)&&(timer>0));
+
+  WriteReg(pProHW,pProslic->channel,SI3218X_REG_LINEFEED,lf);
+
+  if(timer > 0)
+  {
+    return RC_NONE;
+  }
+  else
+  {
+    return RC_CAL_TIMEOUT;
+  }
+}
+#endif
+
+/*
+** Function: PROSLIC_AudioGainSetup
+**
+** Description:
+** configure audio gains
+*/
+int Si3218x_TXAudioGainSetup (proslicChanType *pProslic, int preset)
+{
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_CHANNEL_TYPE_ERR;
+  }
+
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACGAIN,
+           Si3218x_audioGain_Presets[preset].acgain);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACEQ_C0,
+           Si3218x_audioGain_Presets[preset].aceq_c0);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACEQ_C1,
+           Si3218x_audioGain_Presets[preset].aceq_c1);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACEQ_C2,
+           Si3218x_audioGain_Presets[preset].aceq_c2);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACEQ_C3,
+           Si3218x_audioGain_Presets[preset].aceq_c3);
+
+  return RC_NONE;
+}
+
+/*
+** Function: PROSLIC_AudioGainSetup
+**
+** Description:
+** configure audio gains
+*/
+
+int Si3218x_RXAudioGainSetup (proslicChanType *pProslic, int preset)
+{
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_CHANNEL_TYPE_ERR;
+  }
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACGAIN_SAVE,
+           Si3218x_audioGain_Presets[preset].acgain);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACGAIN,
+           Si3218x_audioGain_Presets[preset].acgain);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACEQ_C0,
+           Si3218x_audioGain_Presets[preset].aceq_c0);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACEQ_C1,
+           Si3218x_audioGain_Presets[preset].aceq_c1);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACEQ_C2,
+           Si3218x_audioGain_Presets[preset].aceq_c2);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACEQ_C3,
+           Si3218x_audioGain_Presets[preset].aceq_c3);
+
+  return RC_NONE;
+}
+
+
+/*
+** Function: PROSLIC_AudioGainScale
+**
+** Description:
+** Multiply path gain by passed value for PGA and EQ scale (no reference to dB,
+** multiply by a scale factor)
+*/
+int Si3218x_AudioGainScale (proslicChanType *pProslic, int preset,
+                            uInt32 pga_scale, uInt32 eq_scale,int rx_tx_sel)
+{
+
+  if(rx_tx_sel == TXACGAIN_SEL)
+  {
+    Si3218x_audioGain_Presets[TXACGAIN_SEL].acgain =
+      (Si3218x_Impedance_Presets[preset].txgain/1000)*pga_scale;
+    if (Si3218x_Impedance_Presets[preset].audioEQ.txaceq_c0 & 0x10000000L)
+    {
+      Si3218x_Impedance_Presets[preset].audioEQ.txaceq_c0 |= 0xf0000000L;
+    }
+    if (Si3218x_Impedance_Presets[preset].audioEQ.txaceq_c1 & 0x10000000L)
+    {
+      Si3218x_Impedance_Presets[preset].audioEQ.txaceq_c1 |= 0xf0000000L;
+    }
+    if (Si3218x_Impedance_Presets[preset].audioEQ.txaceq_c2 & 0x10000000L)
+    {
+      Si3218x_Impedance_Presets[preset].audioEQ.txaceq_c2 |= 0xf0000000L;
+    }
+    if (Si3218x_Impedance_Presets[preset].audioEQ.txaceq_c3 & 0x10000000L)
+    {
+      Si3218x_Impedance_Presets[preset].audioEQ.txaceq_c3 |= 0xf0000000L;
+    }
+    Si3218x_audioGain_Presets[TXACGAIN_SEL].aceq_c0 = ((int32)
+        Si3218x_Impedance_Presets[preset].audioEQ.txaceq_c0/1000)*eq_scale;
+    Si3218x_audioGain_Presets[TXACGAIN_SEL].aceq_c1 = ((int32)
+        Si3218x_Impedance_Presets[preset].audioEQ.txaceq_c1/1000)*eq_scale;
+    Si3218x_audioGain_Presets[TXACGAIN_SEL].aceq_c2 = ((int32)
+        Si3218x_Impedance_Presets[preset].audioEQ.txaceq_c2/1000)*eq_scale;
+    Si3218x_audioGain_Presets[TXACGAIN_SEL].aceq_c3 = ((int32)
+        Si3218x_Impedance_Presets[preset].audioEQ.txaceq_c3/1000)*eq_scale;
+
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACGAIN,
+             Si3218x_audioGain_Presets[TXACGAIN_SEL].acgain);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACEQ_C0,
+             Si3218x_audioGain_Presets[TXACGAIN_SEL].aceq_c0);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACEQ_C1,
+             Si3218x_audioGain_Presets[TXACGAIN_SEL].aceq_c1);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACEQ_C2,
+             Si3218x_audioGain_Presets[TXACGAIN_SEL].aceq_c2);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACEQ_C3,
+             Si3218x_audioGain_Presets[TXACGAIN_SEL].aceq_c3);
+  }
+  else
+  {
+    Si3218x_audioGain_Presets[RXACGAIN_SEL].acgain =
+      (Si3218x_Impedance_Presets[preset].rxgain/1000)*pga_scale;
+    if (Si3218x_Impedance_Presets[preset].audioEQ.rxaceq_c0 & 0x10000000L)
+    {
+      Si3218x_Impedance_Presets[preset].audioEQ.rxaceq_c0 |= 0xf0000000L;
+    }
+    if (Si3218x_Impedance_Presets[preset].audioEQ.rxaceq_c1 & 0x10000000L)
+    {
+      Si3218x_Impedance_Presets[preset].audioEQ.rxaceq_c1 |= 0xf0000000L;
+    }
+    if (Si3218x_Impedance_Presets[preset].audioEQ.rxaceq_c2 & 0x10000000L)
+    {
+      Si3218x_Impedance_Presets[preset].audioEQ.rxaceq_c2 |= 0xf0000000L;
+    }
+    if (Si3218x_Impedance_Presets[preset].audioEQ.rxaceq_c3 & 0x10000000L)
+    {
+      Si3218x_Impedance_Presets[preset].audioEQ.rxaceq_c3 |= 0xf0000000L;
+    }
+    Si3218x_audioGain_Presets[RXACGAIN_SEL].aceq_c0 = ((int32)
+        Si3218x_Impedance_Presets[preset].audioEQ.rxaceq_c0/1000)*eq_scale;
+    Si3218x_audioGain_Presets[RXACGAIN_SEL].aceq_c1 = ((int32)
+        Si3218x_Impedance_Presets[preset].audioEQ.rxaceq_c1/1000)*eq_scale;
+    Si3218x_audioGain_Presets[RXACGAIN_SEL].aceq_c2 = ((int32)
+        Si3218x_Impedance_Presets[preset].audioEQ.rxaceq_c2/1000)*eq_scale;
+    Si3218x_audioGain_Presets[RXACGAIN_SEL].aceq_c3 = ((int32)
+        Si3218x_Impedance_Presets[preset].audioEQ.rxaceq_c3/1000)*eq_scale;
+
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACGAIN_SAVE,
+             Si3218x_audioGain_Presets[RXACGAIN_SEL].acgain);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACGAIN,
+             Si3218x_audioGain_Presets[RXACGAIN_SEL].acgain);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACEQ_C0,
+             Si3218x_audioGain_Presets[RXACGAIN_SEL].aceq_c0);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACEQ_C1,
+             Si3218x_audioGain_Presets[RXACGAIN_SEL].aceq_c1);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACEQ_C2,
+             Si3218x_audioGain_Presets[RXACGAIN_SEL].aceq_c2);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACEQ_C3,
+             Si3218x_audioGain_Presets[RXACGAIN_SEL].aceq_c3);
+  }
+  return 0;
+}
+int Si3218x_TXAudioGainScale (proslicChanType *pProslic, int preset,
+                              uInt32 pga_scale, uInt32 eq_scale)
+{
+  return Si3218x_AudioGainScale(pProslic,preset,pga_scale,eq_scale,TXACGAIN_SEL);
+}
+int Si3218x_RXAudioGainScale (proslicChanType *pProslic, int preset,
+                              uInt32 pga_scale, uInt32 eq_scale)
+{
+  return Si3218x_AudioGainScale(pProslic,preset,pga_scale,eq_scale,RXACGAIN_SEL);
+}
+
+
+/*
+** Function: PROSLIC_DCFeedSetup
+**
+** Description:
+** configure dc feed
+*/
+
+#ifndef DISABLE_DCFEED_SETUP
+int Si3218x_DCFeedSetupCfg (proslicChanType *pProslic, Si3218x_DCfeed_Cfg *cfg,
+                            int preset)
+{
+  uInt8 lf;
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_CHANNEL_TYPE_ERR;
+  }
+  lf = ReadReg(pProHW,pProslic->channel,SI3218X_REG_LINEFEED);
+  WriteReg(pProHW,pProslic->channel,SI3218X_REG_LINEFEED,0);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_SLOPE_VLIM,
+           cfg[preset].slope_vlim);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_SLOPE_RFEED,
+           cfg[preset].slope_rfeed);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_SLOPE_ILIM,
+           cfg[preset].slope_ilim);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_SLOPE_DELTA1,cfg[preset].delta1);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_SLOPE_DELTA2,cfg[preset].delta2);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_V_VLIM,cfg[preset].v_vlim);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_V_RFEED,cfg[preset].v_rfeed);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_V_ILIM,cfg[preset].v_ilim);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_CONST_RFEED,
+           cfg[preset].const_rfeed);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_CONST_ILIM,
+           cfg[preset].const_ilim);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_I_VLIM,cfg[preset].i_vlim);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_LCRONHK,cfg[preset].lcronhk);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_LCROFFHK,cfg[preset].lcroffhk);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_LCRDBI,cfg[preset].lcrdbi);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_LONGHITH,cfg[preset].longhith);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_LONGLOTH,cfg[preset].longloth);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_LONGDBI,cfg[preset].longdbi);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_LCRMASK,cfg[preset].lcrmask);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_LCRMASK_POLREV,
+           cfg[preset].lcrmask_polrev);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_LCRMASK_STATE,
+           cfg[preset].lcrmask_state);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_LCRMASK_LINECAP,
+           cfg[preset].lcrmask_linecap);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_VCM_OH,cfg[preset].vcm_oh);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_VOV_BAT,cfg[preset].vov_bat);
+  WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_VOV_GND,cfg[preset].vov_gnd);
+  WriteReg(pProHW,pProslic->channel,SI3218X_REG_LINEFEED,lf);
+
+  return RC_NONE;
+}
+
+#endif
+
+/*
+** Function: PROSLIC_PulseMeterSetup
+**
+** Description:
+** configure pulse metering
+*/
+
+#ifndef DISABLE_PULSE_SETUP
+int Si3218x_PulseMeterSetup (proslicChanType *pProslic, int preset)
+{
+  uInt8 reg;
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_CHANNEL_TYPE_ERR;
+  }
+
+  else
+  {
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_PM_AMP_THRESH,
+             Si3218x_PulseMeter_Presets[preset].pm_amp_thresh);
+    reg = (Si3218x_PulseMeter_Presets[preset].pmFreq<<1)|
+          (Si3218x_PulseMeter_Presets[preset].pmAuto<<3);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_PM_ACTIVE,
+             Si3218x_PulseMeter_Presets[preset].pmActive);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_PM_INACTIVE,
+             Si3218x_PulseMeter_Presets[preset].pmInactive);
+    WriteReg(pProHW,pProslic->channel,SI3218X_REG_PMCON,reg);
+    return RC_NONE;
+  }
+
+}
+#endif
+
+/*
+** Function: PROSLIC_PCMSetup
+**
+** Description:
+** configure pcm
+*/
+
+#ifndef DISABLE_PCM_SETUP
+int Si3218x_PCMSetup(proslicChanType *pProslic, int preset)
+{
+  uInt8 regTemp;
+  uInt8 pmEn;
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_CHANNEL_TYPE_ERR;
+  }
+
+  pmEn = ReadReg(pProHW,pProslic->channel,
+                 SI3218X_REG_PMCON) & 0x01; /* PM/wideband lockout */
+  if (Si3218x_PCM_Presets[preset].widebandEn && pmEn)
+  {
+#ifdef ENABLE_DEBUG
+    LOGPRINT ("%s Wideband Mode is not supported while Pulse Metering is enabled.\n",
+              LOGPRINT_PREFIX);
+#endif
+  }
+  else if (Si3218x_PCM_Presets[preset].widebandEn && !pmEn)
+  {
+    /* TXIIR settings */
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACIIR_B0_1,0x3538E80L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACIIR_B1_1,0x3538E80L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACIIR_A1_1,0x1AA9100L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACIIR_B0_2,0x216D100L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACIIR_B1_2,0x2505400L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACIIR_B2_2,0x216D100L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACIIR_A1_2,0x2CB8100L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACIIR_A2_2,0x1D7FA500L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACIIR_B0_3,0x2CD9B00L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACIIR_B1_3,0x1276D00L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACIIR_B2_3,0x2CD9B00L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACIIR_A1_3,0x2335300L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACIIR_A2_3,0x19D5F700L);
+    /* RXIIR settings */
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACIIR_B0_1,0x6A71D00L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACIIR_B1_1,0x6A71D00L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACIIR_A1_1,0x1AA9100L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACIIR_B0_2,0x216D100L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACIIR_B1_2,0x2505400L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACIIR_B2_2,0x216D100L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACIIR_A1_2,0x2CB8100L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACIIR_A2_2,0x1D7FA500L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACIIR_B0_3,0x2CD9B00L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACIIR_B1_3,0x1276D00L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACIIR_B2_3,0x2CD9B00L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACIIR_A1_3,0x2335300L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACIIR_A2_3,0x19D5F700L);
+    /*
+    ** RXHPF
+    ** Note:  Calling ProSLIC_ZsynthSetup() will overwrite some
+    **        of these values.  ProSLIC_PCMSetup() should always
+    **        be called after loading coefficients when using
+    **        wideband mode
+    */
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACHPF_B0_1,0x7CFF900L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACHPF_B1_1,0x18300700L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACHPF_A1_1,0x79FF201L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACHPF_B0_2,0x7CEDA1DL);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACHPF_B1_2,0x106320D4L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACHPF_B2_2,0x7CEDA1DL);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACHPF_A1_2,0xF9A910FL);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACHPF_A2_2,0x185FFDA8L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACHPF_GAIN,0x08000000L);
+    /* TXHPF */
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACHPF_B0_1,0x0C7FF4CEL);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACHPF_B1_1,0x13800B32L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACHPF_A1_1,0x079FF201L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACHPF_B0_2,0x030FDD10L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACHPF_B1_2,0x19E0996CL);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACHPF_B2_2,0x030FDD10L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACHPF_A1_2,0x0F9A910FL);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACHPF_A2_2,0x185FFDA8L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACHPF_GAIN,0x0CD30000L);
+
+    regTemp = ReadReg(pProHW,pProslic->channel,SI3218X_REG_DIGCON);
+#ifndef DISABLE_HPF_WIDEBAND
+    WriteReg(pProHW,pProslic->channel,SI3218X_REG_DIGCON,
+             regTemp&~(0xC)); /* Enable HPF */
+#else
+    WriteReg(pProHW,pProslic->channel,SI3218X_REG_DIGCON,
+             regTemp|(0xC)); /* Disable HPF */
+#endif
+    regTemp = ReadReg(pProHW,pProslic->channel,SI3218X_REG_ENHANCE);
+    WriteReg(pProHW,pProslic->channel,SI3218X_REG_ENHANCE,regTemp|1);
+  }
+  else
+  {
+    regTemp = ReadReg(pProHW,pProslic->channel,SI3218X_REG_DIGCON);
+    WriteReg(pProHW,pProslic->channel,SI3218X_REG_DIGCON,regTemp&~(0xC));
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACIIR_B0_1,0x3538E80L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACIIR_B1_1,0x3538E80L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACIIR_A1_1,0x1AA9100L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACIIR_B0_2,0x216D100L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACIIR_B1_2,0x2505400L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACIIR_B2_2,0x216D100L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACIIR_A1_2,0x2CB8100L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACIIR_A2_2,0x1D7FA500L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACIIR_B0_3,0x2CD9B00L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACIIR_B1_3,0x1276D00L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACIIR_B2_3,0x2CD9B00L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACIIR_A1_3,0x2335300L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_TXACIIR_A2_3,0x19D5F700L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACIIR_B0_1,0x6A71D00L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACIIR_B1_1,0x6A71D00L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACIIR_A1_1,0x1AA9100L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACIIR_B0_2,0x216D100L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACIIR_B1_2,0x2505400L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACIIR_B2_2,0x216D100L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACIIR_A1_2,0x2CB8100L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACIIR_A2_2,0x1D7FA500L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACIIR_B0_3,0x2CD9B00L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACIIR_B1_3,0x1276D00L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACIIR_B2_3,0x2CD9B00L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACIIR_A1_3,0x2335300L);
+    WriteRAM(pProHW,pProslic->channel,SI3218X_RAM_RXACIIR_A2_3,0x19D5F700L);
+    regTemp = ReadReg(pProHW,pProslic->channel,SI3218X_REG_ENHANCE);
+    WriteReg(pProHW,pProslic->channel,SI3218X_REG_ENHANCE,regTemp&~(1));
+  }
+  regTemp = Si3218x_PCM_Presets[preset].pcmFormat;
+  regTemp |= Si3218x_PCM_Presets[preset].pcm_tri << 5;
+  regTemp |= Si3218x_PCM_Presets[preset].alaw_inv << 2;
+  WriteReg(pProHW,pProslic->channel,SI3218X_REG_PCMMODE,regTemp);
+  regTemp = ReadReg(pProHW,pProslic->channel,SI3218X_REG_PCMTXHI);
+  regTemp &= 3;
+  regTemp |= Si3218x_PCM_Presets[preset].tx_edge<<4;
+  WriteReg(pProHW,pProslic->channel,SI3218X_REG_PCMTXHI,regTemp);
+
+  return RC_NONE;
+}
+#endif
+
+/*
+**
+** PROSLIC CONTROL FUNCTIONS
+**
+*/
+
+/*
+
+** Function: PROSLIC_dbgSetDCFeed
+**
+** Description:
+** provisionally function for setting up
+** dcfeed given desired open circuit voltage
+** and loop current.
+*/
+
+int Si3218x_dbgSetDCFeed (proslicChanType *pProslic, uInt32 v_vlim_val,
+                          uInt32 i_ilim_val, int32 preset)
+{
+#ifndef DISABLE_DCFEED_SETUP
+  /* Note:  * needs more descriptive return codes in the event of an out of range argument */
+  uInt16 vslope = 160;
+  uInt16 rslope = 720;
+  uInt32 vscale1 = 1386;
+  uInt32 vscale2 =
+    1422;   /* 1386x1422 = 1970892 broken down to minimize trunc err */
+  uInt32 iscale1 = 913;
+  uInt32 iscale2 = 334;    /* 913x334 = 304942 */
+  uInt32 i_rfeed_val, v_rfeed_val, const_rfeed_val, i_vlim_val, const_ilim_val,
+         v_ilim_val;
+  int32 signedVal;
+  /* Set Linefeed to open state before modifying DC Feed */
+
+  /* Assumptions must be made to minimize computations.  This limits the
+  ** range of available settings, but should be more than adequate for
+  ** short loop applications.
+  **
+  ** Assumtions:
+  **
+  ** SLOPE_VLIM      =>  160ohms
+  ** SLOPE_RFEED     =>  720ohms
+  ** I_RFEED         =>  3*I_ILIM/4
+  **
+  ** With these assumptions, the DC Feed parameters now become
+  **
+  ** Inputs:      V_VLIM, I_ILIM
+  ** Constants:   SLOPE_VLIM, SLOPE_ILIM, SLOPE_RFEED, SLOPE_DELTA1, SLOPE_DELTA2
+  ** Outputs:     V_RFEED, V_ILIM, I_VLIM, CONST_RFEED, CONST_ILIM
+  **
+  */
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_CHANNEL_TYPE_ERR;
+  }
+
+  /* Validate arguments */
+  if((i_ilim_val < 15)||(i_ilim_val > 45))
+  {
+    return 1;  /* need error code */
+  }
+  if((v_vlim_val < 30)||(v_vlim_val > 52))
+  {
+    return 1;  /* need error code */
+  }
+
+  /* Calculate voltages in mV and currents in uA */
+  v_vlim_val *= 1000;
+  i_ilim_val *= 1000;
+
+  /* I_RFEED */
+  i_rfeed_val = (3*i_ilim_val)/4;
+
+  /* V_RFEED */
+  v_rfeed_val = v_vlim_val - (i_rfeed_val*vslope)/1000;
+
+  /* V_ILIM */
+  v_ilim_val = v_rfeed_val - (rslope*(i_ilim_val - i_rfeed_val))/1000;
+
+  /* I_VLIM */
+  i_vlim_val = (v_vlim_val*1000)/4903;
+
+  /* CONST_RFEED */
+  signedVal = v_rfeed_val * (i_ilim_val - i_rfeed_val);
+  signedVal /= (v_rfeed_val - v_ilim_val);
+  signedVal = i_rfeed_val + signedVal;
+
+  /* signedVal in uA here */
+  signedVal *= iscale1;
+  signedVal /= 100;
+  signedVal *= iscale2;
+  signedVal /= 10;
+
+  if(signedVal < 0)
+  {
+    const_rfeed_val = (signedVal)+ (1L<<29);
+  }
+  else
+  {
+    const_rfeed_val = signedVal & 0x1FFFFFFF;
+  }
+
+  /* CONST_ILIM */
+  const_ilim_val = i_ilim_val;
+
+  /* compute RAM values */
+  v_vlim_val *= vscale1;
+  v_vlim_val /= 100;
+  v_vlim_val *= vscale2;
+  v_vlim_val /= 10;
+
+  v_rfeed_val *= vscale1;
+  v_rfeed_val /= 100;
+  v_rfeed_val *= vscale2;
+  v_rfeed_val /= 10;
+
+  v_ilim_val *= vscale1;
+  v_ilim_val /= 100;
+  v_ilim_val *= vscale2;
+  v_ilim_val /= 10;
+
+  const_ilim_val *= iscale1;
+  const_ilim_val /= 100;
+  const_ilim_val *= iscale2;
+  const_ilim_val /= 10;
+
+  i_vlim_val *= iscale1;
+  i_vlim_val /= 100;
+  i_vlim_val *= iscale2;
+  i_vlim_val /= 10;
+
+  Si3218x_DCfeed_Presets[preset].slope_vlim = 0x18842BD7L;
+  Si3218x_DCfeed_Presets[preset].slope_rfeed = 0x1E8886DEL;
+  Si3218x_DCfeed_Presets[preset].slope_ilim = 0x40A0E0L;
+  Si3218x_DCfeed_Presets[preset].delta1 = 0x1EABA1BFL;
+  Si3218x_DCfeed_Presets[preset].delta2 = 0x1EF744EAL;
+  Si3218x_DCfeed_Presets[preset].v_vlim = v_vlim_val;
+  Si3218x_DCfeed_Presets[preset].v_rfeed = v_rfeed_val;
+  Si3218x_DCfeed_Presets[preset].v_ilim = v_ilim_val;
+  Si3218x_DCfeed_Presets[preset].const_rfeed = const_rfeed_val;
+  Si3218x_DCfeed_Presets[preset].const_ilim = const_ilim_val;
+  Si3218x_DCfeed_Presets[preset].i_vlim = i_vlim_val;
+
+  return RC_NONE;
+#else
+  SILABS_UNREFERENCED_PARAMETER(pProslic);
+  SILABS_UNREFERENCED_PARAMETER(preset);
+  SILABS_UNREFERENCED_PARAMETER(v_vlim_val);
+  SILABS_UNREFERENCED_PARAMETER(i_ilim_val);
+  return RC_IGNORE;
+#endif
+}
+
+/*
+** Function: PROSLIC_dbgSetDCFeedVopen
+**
+** Description:
+** provisionally function for setting up
+** dcfeed given desired open circuit voltage.
+** Entry I_ILIM value will be used.
+*/
+int Si3218x_dbgSetDCFeedVopen (proslicChanType *pProslic, uInt32 v_vlim_val,
+                               int32 preset)
+{
+#ifndef DISABLE_DCFEED_SETUP
+  uInt32 i_ilim_val;
+  uInt32 iscale1 = 913;
+  uInt32 iscale2 = 334;    /* 913x334 = 304942 */
+
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_CHANNEL_TYPE_ERR;
+  }
+
+  /* Read present CONST_ILIM value */
+  i_ilim_val = Si3218x_DCfeed_Presets[preset].const_ilim;
+
+
+  i_ilim_val /= iscale2;
+  i_ilim_val /= iscale1;
+
+  return Si3218x_dbgSetDCFeed(pProslic,v_vlim_val,i_ilim_val,preset);
+#else
+  SILABS_UNREFERENCED_PARAMETER(pProslic);
+  SILABS_UNREFERENCED_PARAMETER(preset);
+  SILABS_UNREFERENCED_PARAMETER(v_vlim_val);
+  return RC_IGNORE;
+#endif
+}
+
+/*
+** Function: PROSLIC_dbgSetDCFeedIloop
+**
+** Description:
+** provisionally function for setting up
+** dcfeed given desired loop current.
+** Entry V_VLIM value will be used.
+*/
+int Si3218x_dbgSetDCFeedIloop (proslicChanType *pProslic, uInt32 i_ilim_val,
+                               int32 preset)
+{
+#ifndef DISABLE_DCFEED_SETUP
+
+  uInt32 v_vlim_val;
+  uInt32 vscale1 = 1386;
+  uInt32 vscale2 =
+    1422;   /* 1386x1422 = 1970892 broken down to minimize trunc err */
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_CHANNEL_TYPE_ERR;
+  }
+
+  /* Read present V_VLIM value */
+  v_vlim_val = Si3218x_DCfeed_Presets[preset].v_vlim;
+
+  v_vlim_val /= vscale2;
+  v_vlim_val /= vscale1;
+
+  return Si3218x_dbgSetDCFeed(pProslic,v_vlim_val,i_ilim_val, preset);
+#else
+  SILABS_UNREFERENCED_PARAMETER(pProslic);
+  SILABS_UNREFERENCED_PARAMETER(preset);
+  SILABS_UNREFERENCED_PARAMETER(i_ilim_val);
+  return RC_IGNORE;
+#endif
+}
+
+typedef struct
+{
+  uInt8   freq;
+  ramData ringfr;      /* trise scale for trap */
+  uInt32  ampScale;
+} ProSLIC_SineRingFreqLookup;
+
+typedef struct
+{
+  uInt8    freq;
+  ramData  rtacth;
+  ramData rtper;
+  ramData rtdb;
+} ProSLIC_SineRingtripLookup;
+
+typedef struct
+{
+  uInt8   freq;
+  uInt16  cfVal[6];
+} ProSLIC_TrapRingFreqLookup;
+
+typedef struct
+{
+  uInt8   freq;
+  ramData rtper;
+  ramData rtdb;
+  uInt32  rtacth[6];
+} ProSLIC_TrapRingtripLookup;
+
+static  const ProSLIC_SineRingFreqLookup sineRingFreqTable[] =
+    /*  Freq RINGFR, vScale */
+  {
+    {15, 0x7F6E930L, 18968L},
+    {16, 0x7F5A8E0L, 20234L},
+    {20, 0x7EFD9D5L, 25301L},
+    {22, 0x7EC770AL, 27843L},
+    {23, 0x7EAA6E2L, 29113L},
+    {25, 0x7E6C925L, 31649L},
+    {30, 0x7DBB96BL, 38014L},
+    {34, 0x7D34155L, 42270L}, /* Actually 33.33Hz */
+    {35, 0x7CEAD72L, 44397L},
+    {40, 0x7BFA887L, 50802L},
+    {45, 0x7AEAE74L, 57233L},
+    {50, 0x79BC384L, 63693L},
+    {0,0,0}
+  }; /* terminator */
+
+static const ProSLIC_SineRingtripLookup sineRingtripTable[] =
+    /*  Freq rtacth */
+  {
+    {15, 11440000L, 0x6A000L, 0x4000L },
+    {16, 10810000L, 0x64000L, 0x4000L },
+    {20, 8690000L,  0x50000L, 0x8000L },
+    {22, 7835000L,  0x48000L, 0x8000L },
+    {23, 7622000L,  0x46000L, 0x8000L },
+    {25, 6980000L,  0x40000L, 0xA000L },
+    {30, 5900000L,  0x36000L, 0xA000L },
+    {34, 10490000L, 0x60000L, 0x6000L }, /* Actually 33.33 */
+    {35, 10060000L, 0x5C000L, 0x6000L },
+    {40, 8750000L,  0x50000L, 0x8000L },
+    {45, 7880000L,  0x48000L, 0x8000L },
+    {50, 7010000L,  0x40000L, 0xA000L },
+    {0,0L, 0L, 0L}
+  }; /* terminator */
+
+static const ProSLIC_TrapRingFreqLookup trapRingFreqTable[] =
+    /*  Freq multCF11 multCF12 multCF13 multCF14 multCF15 multCF16*/
+  {
+    {15, {69,122, 163, 196, 222,244}},
+    {16, {65,115, 153, 184, 208,229}},
+    {20, {52,92, 122, 147, 167,183}},
+    {22, {47,83, 111, 134, 152,166}},
+    {23, {45,80, 107, 128, 145,159}},
+    {25, {42,73, 98, 118, 133,146}},
+    {30, {35,61, 82, 98, 111,122}},
+    {34, {31,55, 73, 88, 100,110}},
+    {35, {30,52, 70, 84, 95,104}},
+    {40, {26,46, 61, 73, 83,91}},
+    {45, {23,41, 54, 65, 74,81}},
+    {50, {21,37, 49, 59, 67,73}},
+    {0,{0L,0L,0L,0L}} /* terminator */
+  };
+
+
+static const ProSLIC_TrapRingtripLookup trapRingtripTable[] =
+    /*  Freq rtper rtdb rtacthCR11 rtacthCR12 rtacthCR13 rtacthCR14 rtacthCR15 rtacthCR16*/
+  {
+    {15, 0x6A000L,  0x4000L, {16214894L, 14369375L, 12933127L, 11793508L, 10874121L, 10121671L}},
+    {16, 0x64000L,  0x4000L, {15201463L, 13471289L, 12124806L, 11056414L, 10194489L, 9489067L}},
+    {20, 0x50000L,  0x6000L, {12161171L, 10777031L, 9699845L, 8845131L, 8155591L, 7591253L}},
+    {22, 0x48000L,  0x6000L, {11055610L, 9797301L, 8818041L, 8041028L, 7414174L, 6901139L}},
+    {23, 0x46000L,  0x6000L, {10574931L, 9371331L, 8434648L, 7691418L, 7091818L, 6601090L}},
+    {25, 0x40000L,  0x8000L, {9728937L, 8621625L, 7759876L, 7076105L, 6524473L, 6073003L}},
+    {30, 0x36000L,  0x8000L, {8107447L, 7184687L, 6466563L, 5896754L, 5437061L, 5060836L}},
+    {34, 0x60000L,  0x6000L, {7297432L, 6466865L, 5820489L, 5307609L, 4893844L, 4555208L}},
+    {35, 0x5C000L,  0x6000L, {6949240L, 6158303L, 5542769L, 5054361L, 4660338L, 4337859L}},
+    {40, 0x50000L,  0x6000L, {6080585L, 5388516L, 4849923L, 4422565L, 4077796L, 3795627L}},
+    {45, 0x48000L,  0x6000L, {5404965L, 4789792L, 4311042L, 3931169L, 3624707L, 3373890L}},
+    {50, 0x40000L,  0x8000L, {4864468L, 4310812L, 3879938L, 3538052L, 3262236L, 3036501L}},
+    {0,0x0L, 0x0L, {0L,0L,0L,0L}} /* terminator */
+  };
+
+/*
+** Function: PROSLIC_dbgRingingSetup
+**
+** Description:
+** Provision function for setting up
+** Ring type, frequency, amplitude and dc offset.
+** Main use will be by peek/poke applications.
+*/
+int Si3218x_dbgSetRinging (proslicChanType *pProslic,
+                           ProSLIC_dbgRingCfg *ringCfg, int preset)
+{
+#ifndef DISABLE_RING_SETUP
+  int errVal,i=0;
+  uInt32 vScale = 1608872L;   /* (2^28/170.25)*((100+4903)/4903) */
+  ramData dcdcVminTmp;
+
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_CHANNEL_TYPE_ERR;
+  }
+
+  errVal = RC_NONE;
+
+  switch(ringCfg->ringtype)
+  {
+    case ProSLIC_RING_SINE:
+      i=0;
+      do
+      {
+        if(sineRingFreqTable[i].freq >= ringCfg->freq)
+        {
+          break;
+        }
+        i++;
+      }
+      while (sineRingFreqTable[i].freq);
+
+      /* Set to maximum value if exceeding maximum value from table */
+      if(sineRingFreqTable[i].freq == 0)
+      {
+        i--;
+        errVal = RC_RING_V_LIMITED;
+      }
+
+      /* Update RINGFR RINGAMP, RINGOFFSET, and RINGCON */
+      Si3218x_Ring_Presets[preset].freq = sineRingFreqTable[i].ringfr;
+      Si3218x_Ring_Presets[preset].amp = ringCfg->amp * sineRingFreqTable[i].ampScale;
+      Si3218x_Ring_Presets[preset].offset = ringCfg->offset * vScale;
+      Si3218x_Ring_Presets[preset].phas = 0L;
+
+      /* Don't alter anything in RINGCON other than clearing the TRAP bit */
+      Si3218x_Ring_Presets[preset].ringcon &= 0xFE;
+
+      Si3218x_Ring_Presets[preset].rtper = sineRingtripTable[i].rtper;
+      Si3218x_Ring_Presets[preset].rtacdb = sineRingtripTable[i].rtdb;
+      Si3218x_Ring_Presets[preset].rtdcdb = sineRingtripTable[i].rtdb;
+      Si3218x_Ring_Presets[preset].rtdcth = 0xFFFFFFFL;
+      Si3218x_Ring_Presets[preset].rtacth = sineRingtripTable[i].rtacth;
+      break;
+
+    case ProSLIC_RING_TRAP_CF11:
+    case ProSLIC_RING_TRAP_CF12:
+    case ProSLIC_RING_TRAP_CF13:
+    case ProSLIC_RING_TRAP_CF14:
+    case ProSLIC_RING_TRAP_CF15:
+    case ProSLIC_RING_TRAP_CF16:
+      i=0;
+      do
+      {
+        if(trapRingFreqTable[i].freq >= ringCfg->freq)
+        {
+          break;
+        }
+        i++;
+      }
+      while (trapRingFreqTable[i].freq);
+
+      /* Set to maximum value if exceeding maximum value from table */
+      if(trapRingFreqTable[i].freq == 0)
+      {
+        i--;
+        errVal = RC_RING_V_LIMITED;
+      }
+
+      /* Update RINGFR RINGAMP, RINGOFFSET, and RINGCON */
+      Si3218x_Ring_Presets[preset].amp = ringCfg->amp * vScale;
+      Si3218x_Ring_Presets[preset].freq =
+        Si3218x_Ring_Presets[preset].amp/trapRingFreqTable[i].cfVal[ringCfg->ringtype];
+      Si3218x_Ring_Presets[preset].offset = ringCfg->offset * vScale;
+      Si3218x_Ring_Presets[preset].phas = 262144000L/trapRingFreqTable[i].freq;
+
+      /* Don't alter anything in RINGCON other than setting the TRAP bit */
+      Si3218x_Ring_Presets[preset].ringcon |= 0x01;
+
+      /* RTPER and debouce timers  */
+      Si3218x_Ring_Presets[preset].rtper = trapRingtripTable[i].rtper;
+      Si3218x_Ring_Presets[preset].rtacdb = trapRingtripTable[i].rtdb;
+      Si3218x_Ring_Presets[preset].rtdcdb = trapRingtripTable[i].rtdb;
+
+
+      Si3218x_Ring_Presets[preset].rtdcth = 0xFFFFFFFL;
+      Si3218x_Ring_Presets[preset].rtacth =
+        trapRingtripTable[i].rtacth[ringCfg->ringtype];
+
+
+      break;
+  }
+
+  /*
+  ** DCDC tracking sluggish under light load at higher ring freq.
+  ** Reduce tracking depth above 40Hz.  This should have no effect
+  ** if using the Buck-Boost architecture.
+  */
+  if((sineRingFreqTable[i].freq >= 40)
+      ||(Si3218x_General_Configuration.bom_option == BO_DCDC_BUCK_BOOST))
+  {
+    dcdcVminTmp = ringCfg->amp + ringCfg->offset;
+    dcdcVminTmp *= 1000;
+    dcdcVminTmp *= SCALE_V_MADC;
+    Si3218x_Ring_Presets[preset].dcdc_vref_min_rng = dcdcVminTmp;
+  }
+  else
+  {
+    Si3218x_Ring_Presets[preset].dcdc_vref_min_rng = 0x1800000L;
+  }
+
+  return errVal;
+#else
+  SILABS_UNREFERENCED_PARAMETER(pProslic);
+  SILABS_UNREFERENCED_PARAMETER(preset);
+  SILABS_UNREFERENCED_PARAMETER(ringCfg);
+  return RC_IGNORE;
+#endif
+}
+
+
+typedef struct
+{
+  int32   gain;
+  uInt32 scale;
+} ProSLIC_GainScaleLookup;
+
+#ifndef ENABLE_HIRES_GAIN
+static int Si3218x_dbgSetGain (proslicChanType *pProslic, int32 gain,
+                               int impedance_preset, int tx_rx_sel)
+{
+  int errVal = 0;
+  int32 i;
+  int32 gain_pga, gain_eq;
+  const ProSLIC_GainScaleLookup gainScaleTable[]
+  =  /*  gain, scale=10^(gain/20) */
+  {
+    {-30, 32},
+    {-29, 35},
+    {-28, 40},
+    {-27, 45},
+    {-26, 50},
+    {-25, 56},
+    {-24, 63},
+    {-23, 71},
+    {-22, 79},
+    {-21, 89},
+    {-20, 100},
+    {-19, 112},
+    {-18, 126},
+    {-17, 141},
+    {-16, 158},
+    {-15, 178},
+    {-14, 200},
+    {-13, 224},
+    {-12, 251},
+    {-11, 282},
+    {-10, 316},
+    {-9, 355},
+    {-8, 398},
+    {-7, 447},
+    {-6, 501},
+    {-5, 562},
+    {-4, 631},
+    {-3, 708},
+    {-2, 794},
+    {-1, 891},
+    {0, 1000},
+    {1, 1122},
+    {2, 1259},
+    {3, 1413},
+    {4, 1585},
+    {5, 1778},
+    {6, 1995},
+    {0xff,0}  /* terminator */
+  };
+
+  SILABS_UNREFERENCED_PARAMETER(pProslic);
+
+  /* Test against max gain */
+  if (gain > PROSLIC_EXTENDED_GAIN_MAX)
+  {
+    errVal = RC_GAIN_OUT_OF_RANGE;
+    DEBUG_PRINT(pProslic, "%sdbgSetGain: Gain %d out of range\n", LOGPRINT_PREFIX,
+                (int)gain);
+    gain = PROSLIC_EXTENDED_GAIN_MAX; /* Clamp to maximum */
+  }
+
+  /* Test against min gain */
+  if (gain < PROSLIC_GAIN_MIN)
+  {
+    errVal = RC_GAIN_OUT_OF_RANGE;
+    DEBUG_PRINT(pProslic, "%sdbgSetGain: Gain %d out of range\n", LOGPRINT_PREFIX,
+                (int)gain);
+    gain = PROSLIC_GAIN_MIN; /* Clamp to minimum */
+  }
+
+  /* Distribute gain */
+  if(gain == 0)
+  {
+    gain_pga = 0;
+    gain_eq = 0;
+  }
+  else if(gain > PROSLIC_GAIN_MAX)
+  {
+    if(tx_rx_sel == TXACGAIN_SEL)
+    {
+      gain_pga = PROSLIC_GAIN_MAX;
+      gain_eq = gain - PROSLIC_GAIN_MAX;
+    }
+    else
+    {
+      gain_pga = gain - PROSLIC_GAIN_MAX;
+      gain_eq = PROSLIC_GAIN_MAX;
+    }
+  }
+  else if(gain > 0)
+  {
+    if(tx_rx_sel == TXACGAIN_SEL)
+    {
+      gain_pga = gain;
+      gain_eq  = 0;
+    }
+    else
+    {
+      gain_pga = 0;
+      gain_eq = gain;
+    }
+  }
+  else
+  {
+    if(tx_rx_sel == TXACGAIN_SEL)
+    {
+      gain_pga = 0;
+      gain_eq  = gain;
+    }
+    else
+    {
+      gain_pga = gain;
+      gain_eq = 0;
+    }
+
+  }
+
+
+  /*
+  ** Lookup PGA Appropriate PGA Gain
+  */
+  i=0;
+  do
+  {
+    if(gainScaleTable[i].gain >= gain_pga)   /* was gain_1 */
+    {
+      break;
+    }
+    i++;
+  }
+  while (gainScaleTable[i].gain!=0xff);
+
+  /* Set to maximum value if exceeding maximum value from table */
+  if(gainScaleTable[i].gain == 0xff)
+  {
+    i--;
+    errVal = RC_GAIN_DELTA_TOO_LARGE;
+  }
+
+  if(tx_rx_sel == TXACGAIN_SEL)
+  {
+    Si3218x_audioGain_Presets[0].acgain =
+      (Si3218x_Impedance_Presets[impedance_preset].txgain/1000)
+      *gainScaleTable[i].scale;
+  }
+  else
+  {
+    Si3218x_audioGain_Presets[1].acgain =
+      (Si3218x_Impedance_Presets[impedance_preset].rxgain/1000)
+      *gainScaleTable[i].scale;
+  }
+
+
+  /*
+  ** Lookup EQ Gain
+  */
+  i=0;
+  do
+  {
+    if(gainScaleTable[i].gain >= gain_eq) /* was gain_2 */
+    {
+      break;
+    }
+    i++;
+  }
+  while (gainScaleTable[i].gain!=0xff);
+
+  /* Set to maximum value if exceeding maximum value from table */
+  if(gainScaleTable[i].gain == 0xff)
+  {
+    i--;
+    errVal = RC_GAIN_DELTA_TOO_LARGE;
+  }
+
+  if(tx_rx_sel == TXACGAIN_SEL)
+  {
+    /*sign extend negative numbers*/
+    if (Si3218x_Impedance_Presets[impedance_preset].audioEQ.txaceq_c0 & 0x10000000L)
+    {
+      Si3218x_Impedance_Presets[impedance_preset].audioEQ.txaceq_c0 |= 0xf0000000L;
+    }
+    if (Si3218x_Impedance_Presets[impedance_preset].audioEQ.txaceq_c1 & 0x10000000L)
+    {
+      Si3218x_Impedance_Presets[impedance_preset].audioEQ.txaceq_c1 |= 0xf0000000L;
+    }
+    if (Si3218x_Impedance_Presets[impedance_preset].audioEQ.txaceq_c2 & 0x10000000L)
+    {
+      Si3218x_Impedance_Presets[impedance_preset].audioEQ.txaceq_c2 |= 0xf0000000L;
+    }
+    if (Si3218x_Impedance_Presets[impedance_preset].audioEQ.txaceq_c3 & 0x10000000L)
+    {
+      Si3218x_Impedance_Presets[impedance_preset].audioEQ.txaceq_c3 |= 0xf0000000L;
+    }
+
+    Si3218x_audioGain_Presets[0].aceq_c0 = ((int32)
+                                            Si3218x_Impedance_Presets[impedance_preset].audioEQ.txaceq_c0/1000)
+                                           *gainScaleTable[i].scale;
+    Si3218x_audioGain_Presets[0].aceq_c1 = ((int32)
+                                            Si3218x_Impedance_Presets[impedance_preset].audioEQ.txaceq_c1/1000)
+                                           *gainScaleTable[i].scale;
+    Si3218x_audioGain_Presets[0].aceq_c2 = ((int32)
+                                            Si3218x_Impedance_Presets[impedance_preset].audioEQ.txaceq_c2/1000)
+                                           *gainScaleTable[i].scale;
+    Si3218x_audioGain_Presets[0].aceq_c3 = ((int32)
+                                            Si3218x_Impedance_Presets[impedance_preset].audioEQ.txaceq_c3/1000)
+                                           *gainScaleTable[i].scale;
+  }
+  else
+  {
+    /*sign extend negative numbers*/
+    if (Si3218x_Impedance_Presets[impedance_preset].audioEQ.rxaceq_c0 & 0x10000000L)
+    {
+      Si3218x_Impedance_Presets[impedance_preset].audioEQ.rxaceq_c0 |= 0xf0000000L;
+    }
+    if (Si3218x_Impedance_Presets[impedance_preset].audioEQ.rxaceq_c1 & 0x10000000L)
+    {
+      Si3218x_Impedance_Presets[impedance_preset].audioEQ.rxaceq_c1 |= 0xf0000000L;
+    }
+    if (Si3218x_Impedance_Presets[impedance_preset].audioEQ.rxaceq_c2 & 0x10000000L)
+    {
+      Si3218x_Impedance_Presets[impedance_preset].audioEQ.rxaceq_c2 |= 0xf0000000L;
+    }
+    if (Si3218x_Impedance_Presets[impedance_preset].audioEQ.rxaceq_c3 & 0x10000000L)
+    {
+      Si3218x_Impedance_Presets[impedance_preset].audioEQ.rxaceq_c3 |= 0xf0000000L;
+    }
+
+    Si3218x_audioGain_Presets[1].aceq_c0 = ((int32)
+                                            Si3218x_Impedance_Presets[impedance_preset].audioEQ.rxaceq_c0/1000)
+                                           *gainScaleTable[i].scale;
+    Si3218x_audioGain_Presets[1].aceq_c1 = ((int32)
+                                            Si3218x_Impedance_Presets[impedance_preset].audioEQ.rxaceq_c1/1000)
+                                           *gainScaleTable[i].scale;
+    Si3218x_audioGain_Presets[1].aceq_c2 = ((int32)
+                                            Si3218x_Impedance_Presets[impedance_preset].audioEQ.rxaceq_c2/1000)
+                                           *gainScaleTable[i].scale;
+    Si3218x_audioGain_Presets[1].aceq_c3 = ((int32)
+                                            Si3218x_Impedance_Presets[impedance_preset].audioEQ.rxaceq_c3/1000)
+                                           *gainScaleTable[i].scale;
+  }
+
+
+  return errVal;
+}
+#else /* ENABLE_HIRES_GAIN */
+/*
+** Function: Si3218x_dbgSetGainHiRes()
+**
+** Description:
+** Provision function for setting up
+** TX and RX gain with 0.1dB resolution instead
+** of 1.0dB resolution
+*/
+static int Si3218x_dbgSetGainHiRes (proslicChanType *pProslic, int32 gain,
+                                    int impedance_preset, int tx_rx_sel)
+{
+  int errVal = 0;
+  int32 i;
+  int32 coarseGainIndex, fineGainIndex;
+  int32 gain_pga, gain_eq;
+  int32 coarseGain, fineGain;
+  int32 tmp;
+  const ProSLIC_GainScaleLookup coarseGainScaleTable[]
+  =  /*  gain, scale=10^(gain/20) */
+  {
+    {-30, 32},
+    {-29, 35},
+    {-28, 40},
+    {-27, 45},
+    {-26, 50},
+    {-25, 56},
+    {-24, 63},
+    {-23, 71},
+    {-22, 79},
+    {-21, 89},
+    {-20, 100},
+    {-19, 112},
+    {-18, 126},
+    {-17, 141},
+    {-16, 158},
+    {-15, 178},
+    {-14, 200},
+    {-13, 224},
+    {-12, 251},
+    {-11, 282},
+    {-10, 316},
+    {-9, 355},
+    {-8, 398},
+    {-7, 447},
+    {-6, 501},
+    {-5, 562},
+    {-4, 631},
+    {-3, 708},
+    {-2, 794},
+    {-1, 891},
+    {0, 1000},
+    {1, 1122},
+    {2, 1259},
+    {3, 1413},
+    {4, 1585},
+    {5, 1778},
+    {6, 1995},
+    {0xff,0}  /* terminator */
+  };
+
+  const ProSLIC_GainScaleLookup fineGainScaleTable[]
+  =  /*  gain, scale=10^(gain/20) */
+  {
+    {-9, 902},
+    {-8, 912},
+    {-7, 923},
+    {-6, 933},
+    {-5, 944},
+    {-4, 955},
+    {-3, 966},
+    {-2, 977},
+    {-1, 989},
+    {0, 1000},
+    {1, 1012},
+    {2, 1023},
+    {3, 1035},
+    {4, 1047},
+    {5, 1059},
+    {6, 1072},
+    {7, 1084},
+    {8, 1096},
+    {9, 1109},
+    {0xff,0}  /* terminator */
+  };
+
+  SILABS_UNREFERENCED_PARAMETER(pProslic);
+
+  /* Test against max gain */
+  if (gain > (PROSLIC_GAIN_MAX*10L))
+  {
+    errVal = RC_GAIN_OUT_OF_RANGE;
+    DEBUG_PRINT(pProslic, "%sdbgSetGain: Gain %d dB*10 out of range\n",
+                LOGPRINT_PREFIX, gain);
+    gain = (PROSLIC_GAIN_MAX*10L); /* Clamp to maximum */
+  }
+
+  /* Test against min gain */
+  if (gain < (PROSLIC_GAIN_MIN*10L))
+  {
+    errVal = RC_GAIN_OUT_OF_RANGE;
+    DEBUG_PRINT(pProslic, "%sdbgSetGain: Gain %d dB*10 out of range\n",
+                LOGPRINT_PREFIX, gain);
+    gain = (PROSLIC_GAIN_MIN*10); /* Clamp to minimum */
+  }
+
+  /* Distribute gain */
+  coarseGain = gain/10L;
+  fineGain = gain - (coarseGain*10L);
+
+  /* Distribute coarseGain */
+  if(coarseGain == 0)
+  {
+    gain_pga = 0;
+    gain_eq = 0;
+  }
+  else if(coarseGain > 0)
+  {
+    if(tx_rx_sel == TXACGAIN_SEL)
+    {
+      gain_pga = coarseGain;
+      gain_eq  = 0;
+    }
+    else
+    {
+      gain_pga = 0;
+      gain_eq = coarseGain;
+    }
+  }
+  else
+  {
+    if(tx_rx_sel == TXACGAIN_SEL)
+    {
+      gain_pga = 0;
+      gain_eq  = coarseGain;
+    }
+    else
+    {
+      gain_pga = coarseGain;
+      gain_eq = 0;
+    }
+  }
+
+  /*
+  ** Lookup PGA Appopriate PGA Gain
+  */
+  i=0;
+  do
+  {
+    if(coarseGainScaleTable[i].gain >= gain_pga)
+    {
+      break;
+    }
+    i++;
+  }
+  while (coarseGainScaleTable[i].gain!=0xff);
+
+  /* Set to maximum value if exceeding maximum value from table */
+  if(coarseGainScaleTable[i].gain == 0xff)
+  {
+    i--;
+    errVal = RC_GAIN_DELTA_TOO_LARGE;
+  }
+
+  coarseGainIndex = i;  /* Store coarse index */
+
+  /* Find fineGain */
+  i = 0;
+  do
+  {
+    if(fineGainScaleTable[i].gain >= fineGain)
+    {
+      break;
+    }
+    i++;
+  }
+  while (fineGainScaleTable[i].gain!=0xff);
+
+  /* Set to maximum value if exceeding maximum value from table */
+  if(fineGainScaleTable[i].gain == 0xff)
+  {
+    i--;
+    errVal = RC_GAIN_DELTA_TOO_LARGE;
+  }
+
+  fineGainIndex = i;
+
+  if(tx_rx_sel == TXACGAIN_SEL)
+  {
+    Si3218x_audioGain_Presets[0].acgain = ((
+        Si3218x_Impedance_Presets[impedance_preset].txgain/1000L)
+                                           *coarseGainScaleTable[coarseGainIndex].scale);
+  }
+  else
+  {
+    Si3218x_audioGain_Presets[1].acgain = ((
+        Si3218x_Impedance_Presets[impedance_preset].rxgain/1000L)
+        * coarseGainScaleTable[coarseGainIndex].scale)/1000L 
+        * fineGainScaleTable[fineGainIndex].scale;
+  }
+
+  /*
+  ** Lookup EQ Gain
+  */
+  i=0;
+  do
+  {
+    if(coarseGainScaleTable[i].gain >= gain_eq)
+    {
+      break;
+    }
+    i++;
+  }
+  while (coarseGainScaleTable[i].gain!=0xff);
+
+  /* Set to maximum value if exceeding maximum value from table */
+  if(coarseGainScaleTable[i].gain == 0xff)
+  {
+    i--;
+    errVal = RC_GAIN_DELTA_TOO_LARGE;
+  }
+
+  coarseGainIndex = i;  /* Store coarse index */
+
+  if(tx_rx_sel == TXACGAIN_SEL)
+  {
+    /*sign extend negative numbers*/
+    if (Si3218x_Impedance_Presets[impedance_preset].audioEQ.txaceq_c0 & 0x10000000L)
+    {
+      Si3218x_Impedance_Presets[impedance_preset].audioEQ.txaceq_c0 |= 0xf0000000L;
+    }
+    if (Si3218x_Impedance_Presets[impedance_preset].audioEQ.txaceq_c1 & 0x10000000L)
+    {
+      Si3218x_Impedance_Presets[impedance_preset].audioEQ.txaceq_c1 |= 0xf0000000L;
+    }
+    if (Si3218x_Impedance_Presets[impedance_preset].audioEQ.txaceq_c2 & 0x10000000L)
+    {
+      Si3218x_Impedance_Presets[impedance_preset].audioEQ.txaceq_c2 |= 0xf0000000L;
+    }
+    if (Si3218x_Impedance_Presets[impedance_preset].audioEQ.txaceq_c3 & 0x10000000L)
+    {
+      Si3218x_Impedance_Presets[impedance_preset].audioEQ.txaceq_c3 |= 0xf0000000L;
+    }
+
+    tmp = (((int32)
+            Si3218x_Impedance_Presets[impedance_preset].audioEQ.txaceq_c0/1000L)
+           *coarseGainScaleTable[coarseGainIndex].scale);
+    tmp = tmp / (int32)1000L;
+    tmp = tmp * (int32)fineGainScaleTable[fineGainIndex].scale;
+    Si3218x_audioGain_Presets[0].aceq_c0 = tmp;
+
+    tmp = (((int32)
+            Si3218x_Impedance_Presets[impedance_preset].audioEQ.txaceq_c1/1000L)
+           *coarseGainScaleTable[coarseGainIndex].scale);
+    tmp = tmp / (int32)1000L;
+    tmp = tmp * (int32)fineGainScaleTable[fineGainIndex].scale;
+    Si3218x_audioGain_Presets[0].aceq_c1 = tmp;
+
+    tmp = (((int32)
+            Si3218x_Impedance_Presets[impedance_preset].audioEQ.txaceq_c2/1000L)
+           *coarseGainScaleTable[coarseGainIndex].scale);
+    tmp = tmp / (int32)1000L;
+    tmp = tmp * (int32)fineGainScaleTable[fineGainIndex].scale;
+    Si3218x_audioGain_Presets[0].aceq_c2 = tmp;
+
+    tmp = (((int32)
+            Si3218x_Impedance_Presets[impedance_preset].audioEQ.txaceq_c3/1000L)
+           *coarseGainScaleTable[coarseGainIndex].scale);
+    tmp = tmp / (int32)1000L;
+    tmp = tmp * (int32)fineGainScaleTable[fineGainIndex].scale;
+    Si3218x_audioGain_Presets[0].aceq_c3 = tmp;
+  }
+  else
+  {
+    /*sign extend negative numbers*/
+    if (Si3218x_Impedance_Presets[impedance_preset].audioEQ.rxaceq_c0 & 0x10000000L)
+    {
+      Si3218x_Impedance_Presets[impedance_preset].audioEQ.rxaceq_c0 |= 0xf0000000L;
+    }
+    if (Si3218x_Impedance_Presets[impedance_preset].audioEQ.rxaceq_c1 & 0x10000000L)
+    {
+      Si3218x_Impedance_Presets[impedance_preset].audioEQ.rxaceq_c1 |= 0xf0000000L;
+    }
+    if (Si3218x_Impedance_Presets[impedance_preset].audioEQ.rxaceq_c2 & 0x10000000L)
+    {
+      Si3218x_Impedance_Presets[impedance_preset].audioEQ.rxaceq_c2 |= 0xf0000000L;
+    }
+    if (Si3218x_Impedance_Presets[impedance_preset].audioEQ.rxaceq_c3 & 0x10000000L)
+    {
+      Si3218x_Impedance_Presets[impedance_preset].audioEQ.rxaceq_c3 |= 0xf0000000L;
+    }
+
+    Si3218x_audioGain_Presets[1].aceq_c0 = ((int32)
+      Si3218x_Impedance_Presets[impedance_preset].audioEQ.rxaceq_c0/1000)
+                                           *coarseGainScaleTable[i].scale;
+    Si3218x_audioGain_Presets[1].aceq_c1 = ((int32)
+      Si3218x_Impedance_Presets[impedance_preset].audioEQ.rxaceq_c1/1000)
+      * coarseGainScaleTable[i].scale;
+    Si3218x_audioGain_Presets[1].aceq_c2 = ((int32)
+      Si3218x_Impedance_Presets[impedance_preset].audioEQ.rxaceq_c2/1000)
+      * coarseGainScaleTable[i].scale;
+    Si3218x_audioGain_Presets[1].aceq_c3 = ((int32)
+      Si3218x_Impedance_Presets[impedance_preset].audioEQ.rxaceq_c3/1000)
+      * coarseGainScaleTable[i].scale;
+  }
+
+  return errVal;
+}
+#endif /* ENABLE_HIRES_GAIN */
+
+/*
+** Function: PROSLIC_dbgSetTXGain
+**
+** Description:
+** Provision function for setting up
+** TX gain
+*/
+
+int Si3218x_dbgSetTXGain (proslicChanType *pProslic, int32 gain,
+                          int impedance_preset, int audio_gain_preset)
+{
+  SILABS_UNREFERENCED_PARAMETER(audio_gain_preset);
+#ifdef ENABLE_HIRES_GAIN
+  return Si3218x_dbgSetGainHiRes(pProslic,gain,impedance_preset,TXACGAIN_SEL);
+#else
+  return Si3218x_dbgSetGain(pProslic,gain,impedance_preset,TXACGAIN_SEL);
+#endif
+}
+
+/*
+** Function: PROSLIC_dbgSetRXGain
+**
+** Description:
+** Provision function for setting up
+** RX gain
+*/
+int Si3218x_dbgSetRXGain (proslicChanType *pProslic, int32 gain,
+                          int impedance_preset, int audio_gain_preset)
+{
+  SILABS_UNREFERENCED_PARAMETER(audio_gain_preset);
+#ifdef ENABLE_HIRES_GAIN
+  return Si3218x_dbgSetGainHiRes(pProslic,gain,impedance_preset,RXACGAIN_SEL);
+#else
+  return Si3218x_dbgSetGain(pProslic,gain,impedance_preset,RXACGAIN_SEL);
+#endif
+}
+
+/*
+** Function: Si3218x_GetRAMScale
+**
+** Description:
+** Read scale factor for passed RAM location
+**
+** Return Value:
+** int32 scale
+*/
+static int32 Si3218x_GetRAMScale(uInt16 addr)
+{
+  int32 scale;
+
+  switch(addr)
+  {
+    case SI3218X_RAM_MADC_ILOOP:
+    case SI3218X_RAM_MADC_ITIP:
+    case SI3218X_RAM_MADC_IRING:
+    case SI3218X_RAM_MADC_ILONG:
+      scale = SCALE_I_MADC;
+      break;
+
+    case SI3218X_RAM_MADC_VTIPC:
+    case SI3218X_RAM_MADC_VRINGC:
+    case SI3218X_RAM_MADC_VBAT:
+    case SI3218X_RAM_MADC_VDC:
+    case SI3218X_RAM_MADC_VDC_OS:
+    case SI3218X_RAM_MADC_VLONG:
+    case SI3218X_RAM_VDIFF_SENSE:
+    case SI3218X_RAM_VDIFF_FILT:
+    case SI3218X_RAM_VDIFF_COARSE:
+    case SI3218X_RAM_VTIP:
+    case SI3218X_RAM_VRING:
+      scale = SCALE_V_MADC;
+      break;
+
+    default:
+      scale = 1;
+      break;
+  }
+
+  return scale;
+}
+
+/*
+** Function: Si3218x_ReadMADCScaled
+**
+** Description:
+** Read MADC (or other sensed voltages/currents) and
+** return scaled value in int32 format.
+**
+** Return Value:
+** int32 voltage in mV or
+** int32 current in uA
+*/
+int32 Si3218x_ReadMADCScaled(proslicChanType_ptr pProslic,uInt16 addr,
+                             int32 scale)
+{
+  int32 data;
+
+  /*
+  ** Read 29-bit RAM and sign extend to 32-bits
+  */
+  data = ReadRAM(pProHW,pProslic->channel,addr);
+  if(data & 0x10000000L)
+  {
+    data |= 0xF0000000L;
+  }
+
+  /*
+  ** Scale to provided value, or use defaults if scale = 0
+  */
+  if(scale == 0)
+  {
+    scale = Si3218x_GetRAMScale(addr);
+  }
+
+  data /= scale;
+
+  return data;
+}
+
+/*
+** Function: Si3218x_LineMonitor
+**
+** Description:
+** Monitor line voltages and currents
+*/
+int Si3218x_LineMonitor(proslicChanType *pProslic, proslicMonitorType *monitor)
+{
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_CHANNEL_TYPE_ERR;
+  }
+
+  if(pProslic->channelEnable)
+  {
+    monitor->vtr    = ReadRAM(pProHW,pProslic->channel,SI3218X_RAM_VDIFF_FILT);
+    if(monitor->vtr & 0x10000000L)
+    {
+      monitor->vtr |= 0xf0000000L;
+    }
+    monitor->vtr /= SCALE_V_MADC;
+
+    monitor->vtip    = ReadRAM(pProHW,pProslic->channel,SI3218X_RAM_VTIP);
+    if(monitor->vtip & 0x10000000L)
+    {
+      monitor->vtip |= 0xf0000000L;
+    }
+    monitor->vtip /= SCALE_V_MADC;
+
+    monitor->vring    = ReadRAM(pProHW,pProslic->channel,SI3218X_RAM_VRING);
+    if(monitor->vring & 0x10000000L)
+    {
+      monitor->vring |= 0xf0000000L;
+    }
+    monitor->vring /= SCALE_V_MADC;
+
+    monitor->vlong    = ReadRAM(pProHW,pProslic->channel,SI3218X_RAM_MADC_VLONG);
+    if(monitor->vlong & 0x10000000L)
+    {
+      monitor->vlong |= 0xf0000000L;
+    }
+    monitor->vlong /= SCALE_V_MADC;
+
+    monitor->vbat    = ReadRAM(pProHW,pProslic->channel,SI3218X_RAM_MADC_VBAT);
+    if(monitor->vbat & 0x10000000L)
+    {
+      monitor->vbat |= 0xf0000000L;
+    }
+    monitor->vbat /= SCALE_V_MADC;
+
+    monitor->vdc = 0; /* Si3218x has no SVDC */
+
+    monitor->itr  = ReadRAM(pProHW,pProslic->channel,SI3218X_RAM_MADC_ILOOP);
+    if(monitor->itr & 0x10000000L)
+    {
+      monitor->itr |= 0xf0000000L;
+    }
+    monitor->itr /= SCALE_I_MADC;
+
+    monitor->itip  = ReadRAM(pProHW,pProslic->channel,SI3218X_RAM_MADC_ITIP);
+    if(monitor->itip & 0x10000000L)
+    {
+      monitor->itip |= 0xf0000000L;
+    }
+    monitor->itip /= SCALE_I_MADC;
+
+    monitor->iring  = ReadRAM(pProHW,pProslic->channel,SI3218X_RAM_MADC_IRING);
+    if(monitor->iring & 0x10000000L)
+    {
+      monitor->iring |= 0xf0000000L;
+    }
+    monitor->iring /= SCALE_I_MADC;
+
+    monitor->ilong  = ReadRAM(pProHW,pProslic->channel,SI3218X_RAM_MADC_ILONG);
+    if(monitor->ilong & 0x10000000L)
+    {
+      monitor->ilong |= 0xf0000000L;
+    }
+    monitor->ilong /= SCALE_I_MADC;
+
+    monitor->p_hvic  = ReadRAM(pProHW,pProslic->channel,
+                               SI3218X_RAM_P_Q1_D); /* P_HVIC_LPF */
+    if(monitor->p_hvic & 0x10000000L)
+    {
+      monitor->p_hvic |= 0xf0000000L;
+    }
+    monitor->p_hvic /= SCALE_P_MADC;
+  }
+
+  return RC_NONE;
+}
+
+/*
+** Function: Si3218x_PSTNCheck
+**
+** Description:
+** Continuous monitoring of longitudinal current.
+** If an average of N samples exceed avgThresh or a
+** single sample exceeds singleThresh, the linefeed
+** is forced into the open state.
+**
+** This protects the port from connecting to a live
+** pstn line (faster than power alarm).
+**
+*/
+int Si3218x_PSTNCheck (proslicChanType *pProslic,
+                       proslicPSTNCheckObjType *pPSTNCheck)
+{
+  uInt8 i;
+
+  if( (pProslic->channelType != PROSLIC)
+      || (pPSTNCheck->samples == 0) )
+  {
+    return RC_NONE;    /* Ignore DAA channels */
+  }
+
+  /* Adjust buffer index */
+  if(pPSTNCheck->count >= pPSTNCheck->samples)
+  {
+    pPSTNCheck->buffFull = TRUE;
+    pPSTNCheck->count = 0;   /* reset buffer ptr */
+  }
+
+  /* Read next sample */
+  pPSTNCheck->ilong[pPSTNCheck->count]  = ReadRAM(pProHW,pProslic->channel,
+                                          SI3218X_RAM_MADC_ILONG);
+  if(pPSTNCheck->ilong[pPSTNCheck->count] & 0x10000000L)
+  {
+    pPSTNCheck->ilong[pPSTNCheck->count] |= 0xf0000000L;
+  }
+  pPSTNCheck->ilong[pPSTNCheck->count] /= SCALE_I_MADC;
+
+  /* Monitor magnitude only */
+  if(pPSTNCheck->ilong[pPSTNCheck->count] < 0)
+  {
+    pPSTNCheck->ilong[pPSTNCheck->count] = -pPSTNCheck->ilong[pPSTNCheck->count];
+  }
+
+  /* Quickly test for single measurement violation */
+  if(pPSTNCheck->ilong[pPSTNCheck->count] > pPSTNCheck->singleThresh)
+  {
+    return RC_PSTN_CHECK_SINGLE_FAIL;  /* fail */
+  }
+
+  /* Average once buffer is full */
+  if(pPSTNCheck->buffFull == TRUE)
+  {
+    pPSTNCheck->avgIlong = 0;
+    for(i=0; i<pPSTNCheck->samples; i++)
+    {
+      pPSTNCheck->avgIlong += pPSTNCheck->ilong[i];
+    }
+    pPSTNCheck->avgIlong /= pPSTNCheck->samples;
+
+    if(pPSTNCheck->avgIlong > pPSTNCheck->avgThresh)
+    {
+      /* reinit obj and return fail */
+      pPSTNCheck->count = 0;
+      pPSTNCheck->buffFull = FALSE;
+      return RC_PSTN_CHECK_AVG_FAIL;
+    }
+    else
+    {
+      pPSTNCheck->count++;
+      return RC_NONE;
+    }
+  }
+  else
+  {
+    pPSTNCheck->count++;
+    return RC_NONE;
+  }
+}
+
+#ifdef PSTN_DET_ENABLE
+/*
+** Function: abs_int32
+**
+** Description:
+** abs implementation for int32 type
+*/
+static int32 abs_int32(int32 a)
+{
+  if(a < 0)
+  {
+    return -1*a;
+  }
+  return a;
+}
+
+/*
+** Function: Si3218x_DiffPSTNCheck
+**
+** Description:
+** Monitor for excessive longitudinal current, which
+** would be present if a live pstn line was connected
+** to the port.
+**
+** Returns:
+** RC_NONE             - test in progress
+** RC_COMPLETE_NO_ERR  - test complete, no alarms or errors
+** RC_POWER_ALARM_HVIC - test interrupted by HVIC power alarm
+** RC_
+**
+*/
+
+int Si3218x_DiffPSTNCheck (proslicChanType *pProslic,
+                           proslicDiffPSTNCheckObjType *pPSTNCheck)
+{
+  uInt8 loop_status;
+  int i;
+
+  if(pProslic->channelType != PROSLIC)
+  {
+    return RC_CHANNEL_TYPE_ERR;    /* Ignore DAA channels */
+  }
+
+
+  switch(pPSTNCheck->pState.stage)
+  {
+    case 0:
+      /* Optional OPEN foreign voltage measurement - only execute if LCS = 0 */
+      /* Disable low power mode */
+      pPSTNCheck->enhanceRegSave = ReadReg(pProHW,pProslic->channel, PROSLIC_REG_ENHANCE);
+      WriteReg(pProHW,pProslic->channel, PROSLIC_REG_ENHANCE,
+               pPSTNCheck->enhanceRegSave&0x07); /* Disable powersave */
+      pPSTNCheck->vdiff1_avg = 0;
+      pPSTNCheck->vdiff2_avg = 0;
+      pPSTNCheck->iloop1_avg = 0;
+      pPSTNCheck->iloop2_avg = 0;
+      pPSTNCheck->return_status = RC_COMPLETE_NO_ERR;
+      /* Do OPEN state hazardous voltage measurement if enabled and ONHOOK */
+      Si3218x_ReadHookStatus(pProslic,&loop_status);
+      if((loop_status == PROSLIC_ONHOOK)&&(pPSTNCheck->femf_enable == 1))
+      {
+        pPSTNCheck->pState.stage++;
+      }
+      else
+      {
+        pPSTNCheck->pState.stage = 10;
+      }
+
+      return RC_NONE;
+
+    case 1:
+      /* Change linefeed to OPEN state for HAZV measurement, setup coarse sensors */
+      pPSTNCheck->lfstate_entry = ReadReg(pProHW,pProslic->channel, PROSLIC_REG_LINEFEED);
+      ProSLIC_SetLinefeedStatus(pProslic,LF_OPEN);
+      pPSTNCheck->pState.stage++;
+      return RC_NONE;
+
+    case 2:
+      /* Settle */
+      ProSLIC_PSTN_delay_poll(&(pPSTNCheck->pState), PSTN_DET_OPEN_FEMF_SETTLE);
+      return RC_NONE;
+
+    case 3:
+      /* Measure HAZV */
+      pPSTNCheck->vdiff_open = Si3218x_ReadMADCScaled(pProslic,SI3218X_RAM_VDIFF_COARSE,0);
+      DEBUG_PRINT(pProslic, "%sDiff PSTN : Vopen = %d mV\n", LOGPRINT_PREFIX,
+                  pPSTNCheck->vdiff_open);
+
+      /* Stop PSTN check if differential voltage > max_femf_vopen present */
+      if(abs_int32(pPSTNCheck->vdiff_open) > pPSTNCheck->max_femf_vopen)
+      {
+        pPSTNCheck->pState.stage = 70;
+        pPSTNCheck->return_status = RC_PSTN_OPEN_FEMF;
+      }
+      else
+      {
+        pPSTNCheck->pState.stage = 10;
+      }
+      return 0;
+
+    case 10:
+      /* Load first DC feed preset */
+      ProSLIC_DCFeedSetup(pProslic,pPSTNCheck->dcfPreset1);
+      ProSLIC_SetLinefeedStatus(pProslic,LF_FWD_ACTIVE);
+      pPSTNCheck->pState.stage++;
+      return RC_NONE;
+
+    case 11:
+      /* Settle */
+      ProSLIC_PSTN_delay_poll(&(pPSTNCheck->pState), PSTN_DET_DIFF_IV1_SETTLE);
+      return RC_NONE;
+
+    case 12:
+      /* Measure VDIFF and ILOOP, switch to 2nd DCFEED setup */
+      pPSTNCheck->vdiff1[pPSTNCheck->pState.sampleIterations] =
+        Si3218x_ReadMADCScaled(pProslic,SI3218X_RAM_VDIFF_FILT,0);
+      pPSTNCheck->iloop1[pPSTNCheck->pState.sampleIterations] =
+        Si3218x_ReadMADCScaled(pProslic,SI3218X_RAM_MADC_ILOOP,0);
+#ifdef ENABLE_DEBUG
+      if ( DEBUG_ENABLED(pProslic) )
+      {
+        LOGPRINT("%sDiff PSTN: Vdiff1[%d] = %d mV\n", LOGPRINT_PREFIX,
+                 pPSTNCheck->pState.sampleIterations,
+                 pPSTNCheck->vdiff1[pPSTNCheck->pState.sampleIterations]);
+        LOGPRINT("%sDiff PSTN: Iloop1[%d] = %d uA\n", LOGPRINT_PREFIX,
+                 pPSTNCheck->pState.sampleIterations,
+                 pPSTNCheck->iloop1[pPSTNCheck->pState.sampleIterations]);
+      }
+#endif
+      pPSTNCheck->pState.sampleIterations++;
+      if(pPSTNCheck->pState.sampleIterations >= pPSTNCheck->samples)
+      {
+        ProSLIC_DCFeedSetup(pProslic,pPSTNCheck->dcfPreset2);
+        pPSTNCheck->pState.stage++;
+        pPSTNCheck->pState.sampleIterations = 0;
+      }
+      return RC_NONE;
+
+    case 13:
+      /* Settle feed 500ms */
+      ProSLIC_PSTN_delay_poll(&(pPSTNCheck->pState), PSTN_DET_DIFF_IV2_SETTLE);
+      return RC_NONE;
+
+    case 14:
+      /* Measure VDIFF and ILOOP*/
+      pPSTNCheck->vdiff2[pPSTNCheck->pState.sampleIterations] =
+        Si3218x_ReadMADCScaled(pProslic,SI3218X_RAM_VDIFF_FILT,0);
+      pPSTNCheck->iloop2[pPSTNCheck->pState.sampleIterations] =
+        Si3218x_ReadMADCScaled(pProslic,SI3218X_RAM_MADC_ILOOP,0);
+#ifdef ENABLE_DEBUG
+      if ( DEBUG_ENABLED(pProslic) )
+      {
+        LOGPRINT("%sDiff PSTN: Vdiff2[%d] = %d mV\n", LOGPRINT_PREFIX,
+                 pPSTNCheck->pState.sampleIterations,
+                 pPSTNCheck->vdiff2[pPSTNCheck->pState.sampleIterations]);
+        LOGPRINT("%sDiff PSTN: Iloop2[%d] = %d uA\n", LOGPRINT_PREFIX,
+                 pPSTNCheck->pState.sampleIterations,
+                 pPSTNCheck->iloop2[pPSTNCheck->pState.sampleIterations]);
+      }
+#endif
+      pPSTNCheck->pState.sampleIterations++;
+      if(pPSTNCheck->pState.sampleIterations >= pPSTNCheck->samples)
+      {
+        /* Compute averages */
+        for (i=0; i<pPSTNCheck->samples; i++)
+        {
+          pPSTNCheck->vdiff1_avg += pPSTNCheck->vdiff1[i];
+          pPSTNCheck->iloop1_avg += pPSTNCheck->iloop1[i];
+          pPSTNCheck->vdiff2_avg += pPSTNCheck->vdiff2[i];
+          pPSTNCheck->iloop2_avg += pPSTNCheck->iloop2[i];
+        }
+
+        pPSTNCheck->vdiff1_avg /= pPSTNCheck->samples;
+        pPSTNCheck->iloop1_avg /= pPSTNCheck->samples;
+        pPSTNCheck->vdiff2_avg /= pPSTNCheck->samples;
+        pPSTNCheck->iloop2_avg /= pPSTNCheck->samples;
+
+        /* Force small (probably offset) currents to minimum value */
+        if(abs_int32(pPSTNCheck->iloop1_avg) < PSTN_DET_MIN_ILOOP)
+        {
+          pPSTNCheck->iloop1_avg = PSTN_DET_MIN_ILOOP;
+        }
+        if(abs_int32(pPSTNCheck->iloop2_avg) < PSTN_DET_MIN_ILOOP)
+        {
+          pPSTNCheck->iloop2_avg = PSTN_DET_MIN_ILOOP;
+        }
+
+        /* Calculate measured loop impedance */
+        pPSTNCheck->rl1 = abs_int32((
+                                      pPSTNCheck->vdiff1_avg*1000L)/pPSTNCheck->iloop1_avg);
+        pPSTNCheck->rl2 = abs_int32((
+                                      pPSTNCheck->vdiff2_avg*1000L)/pPSTNCheck->iloop2_avg);
+
+        /* Force non-zero loop resistance */
+        if(pPSTNCheck->rl1 == 0)
+        {
+          pPSTNCheck->rl1 = 1;
+        }
+        if(pPSTNCheck->rl2 == 0)
+        {
+          pPSTNCheck->rl2 = 1;
+        }
+
+        /* Qualify loop impedances */
+        pPSTNCheck->rl_ratio = (pPSTNCheck->rl1*1000L)/pPSTNCheck->rl2;
+#ifdef ENABLE_DEBUG
+        if ( DEBUG_ENABLED(pProslic) )
+        {
+          const char fmt_string[] = "%sDiffPSTN: %s = %d %s\n";
+          LOGPRINT(fmt_string, LOGPRINT_PREFIX, "VDIFF1", pPSTNCheck->vdiff1_avg, "mV");
+          LOGPRINT(fmt_string, LOGPRINT_PREFIX, "ILOOP1",pPSTNCheck->iloop1_avg, "uA");
+          LOGPRINT(fmt_string, LOGPRINT_PREFIX, "VDIFF2",pPSTNCheck->vdiff2_avg, "mV");
+          LOGPRINT(fmt_string, LOGPRINT_PREFIX, "ILOOP2",pPSTNCheck->iloop2_avg, "uA");
+          LOGPRINT(fmt_string, LOGPRINT_PREFIX, "RL1",pPSTNCheck->rl1, "ohm");
+          LOGPRINT(fmt_string, LOGPRINT_PREFIX, "RL2",pPSTNCheck->rl2, "ohm");
+          LOGPRINT(fmt_string, LOGPRINT_PREFIX, "RL_Ratio",pPSTNCheck->rl_ratio, " ");
+        }
+#endif
+
+        /* Restore */
+        pPSTNCheck->pState.sampleIterations = 0;
+        pPSTNCheck->pState.stage = 70;
+      }
+      return RC_NONE;
+
+    case 70:  /* Reset test state, restore entry conditions */
+      ProSLIC_DCFeedSetup(pProslic,pPSTNCheck->entryDCFeedPreset);
+      ProSLIC_SetLinefeedStatus(pProslic,pPSTNCheck->lfstate_entry);
+      WriteReg(pProHW,pProslic->channel,PROSLIC_REG_ENHANCE, pPSTNCheck->enhanceRegSave);
+      pPSTNCheck->pState.stage = 0;
+      pPSTNCheck->pState.waitIterations = 0;
+      pPSTNCheck->pState.sampleIterations = 0;
+      return pPSTNCheck->return_status;
+
+  }
+  return RC_NONE;
+}
+
+#endif
+
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/src/si_voice.c b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/src/si_voice.c
new file mode 100644
index 0000000..c30ee2c
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/src/si_voice.c
@@ -0,0 +1,563 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Author(s):
+ * laj
+ *
+ * Distributed by:
+ * Silicon Laboratories, Inc
+ *
+ * This file contains proprietary information.
+ * No dissemination allowed without prior written permission from
+ * Silicon Laboratories, Inc.
+ *
+ * File Description:
+ * This file contains common (ProSIC + DAA) functions.
+ *
+ */
+
+#include "../config_inc/si_voice_datatypes.h"
+#include "../inc/si_voice.h"
+#include "../config_inc/proslic_api_config.h"
+
+#ifdef ENABLE_DEBUG
+#define LOGPRINT_PREFIX "SiVoice: "
+#endif
+
+#ifdef SI3217X
+#include "si3217x.h"
+#include "si3217x_intf.h"
+#endif
+
+#ifdef SI3218X
+#include "../inc/si3218x.h"
+#include "../inc/si3218x_intf.h"
+#endif
+
+#ifdef SI3219X
+#include "si3219x.h"
+#include "si3219x_intf.h"
+#endif
+
+#ifdef SI3226X
+#include "si3226x.h"
+#include "si3226x_intf.h"
+#endif
+
+#ifdef SI3228X
+#include "si3228x.h"
+#include "si3228x_intf.h"
+#endif
+
+#define pCtrl(X)           (X)->deviceId->ctrlInterface
+#define pProHW(X)          pCtrl((X))->hCtrl
+#define ReadReg(PCHAN, CHANNEL, REGADDR) (PCHAN)->deviceId->ctrlInterface->ReadRegister_fptr(pProHW(PCHAN), (CHANNEL), (REGADDR))
+#define WriteReg(PCHAN, CHANNEL, REGADDR, REGDATA) (PCHAN)->deviceId->ctrlInterface->WriteRegister_fptr(pProHW(PCHAN), (CHANNEL), (REGADDR), (REGDATA))
+
+/*
+** Control object constructor/destructor
+*/
+int SiVoice_createControlInterfaces (SiVoiceControlInterfaceType **pCtrlIntf,
+                                     uInt32 interface_count)
+{
+  TRACEPRINT_NOCHAN("count = %lu\n", (unsigned long)interface_count);
+#ifndef DISABLE_MALLOC
+  *pCtrlIntf = SIVOICE_CALLOC(sizeof(SiVoiceControlInterfaceType),
+                              interface_count);
+  if(*pCtrlIntf == NULL)
+  {
+#ifdef ENABLE_DEBUG
+    LOGPRINT("%s%s: failed to allocate memory", LOGPRINT_PREFIX, __FUNCTION__);
+#endif
+    return RC_NO_MEM;
+  }
+
+  return RC_NONE;
+#else
+  SILABS_UNREFERENCED_PARAMETER(pCtrlIntf);
+  SILABS_UNREFERENCED_PARAMETER(interface_count);
+  return RC_UNSUPPORTED_FEATURE;
+#endif
+}
+
+int SiVoice_destroyControlInterfaces ( SiVoiceControlInterfaceType **pCtrlIntf )
+{
+
+  TRACEPRINT_NOCHAN("\n",NULL);
+#ifndef DISABLE_MALLOC
+  if( pCtrlIntf && *pCtrlIntf)
+  {
+    SIVOICE_FREE ((SiVoiceControlInterfaceType *)*pCtrlIntf);
+    *pCtrlIntf = NULL;
+  }
+  return RC_NONE;
+#else
+  SILABS_UNREFERENCED_PARAMETER(pCtrlIntf);
+  return RC_UNSUPPORTED_FEATURE;
+#endif
+}
+
+/*
+** Device object constructor/destructor
+*/
+int SiVoice_createDevices (SiVoiceDeviceType **pDevice, uInt32 device_count)
+{
+
+  TRACEPRINT_NOCHAN("\n",NULL);
+#ifndef DISABLE_MALLOC
+  *pDevice = SIVOICE_CALLOC (sizeof(SiVoiceDeviceType), device_count);
+
+  if(*pDevice == NULL)
+  {
+#ifdef ENABLE_DEBUG
+    LOGPRINT("%s%s: failed to allocate memory", LOGPRINT_PREFIX, __FUNCTION__);
+#endif
+    return RC_NO_MEM;
+  }
+  return RC_NONE;
+#else
+  SILABS_UNREFERENCED_PARAMETER(pDevice);
+  SILABS_UNREFERENCED_PARAMETER(device_count);
+  return RC_UNSUPPORTED_FEATURE;
+#endif
+}
+
+int SiVoice_destroyDevices (SiVoiceDeviceType **pDevice)
+{
+
+  TRACEPRINT_NOCHAN("\n", NULL);
+#ifndef DISABLE_MALLOC
+  if(pDevice && *pDevice)
+  {
+    SIVOICE_FREE ((SiVoiceDeviceType *)*pDevice);
+    *pDevice = NULL;
+  }
+  return RC_NONE;
+#else
+  SILABS_UNREFERENCED_PARAMETER(pDevice);
+  return RC_UNSUPPORTED_FEATURE;
+#endif
+}
+
+/*
+** Channel object constructor/destructor
+*/
+int SiVoice_createChannels (SiVoiceChanType_ptr *pChan, uInt32 channel_count)
+{
+
+  TRACEPRINT_NOCHAN("count = %lu\n", (unsigned long) channel_count);
+#ifndef DISABLE_MALLOC
+  *pChan = SIVOICE_CALLOC(sizeof(SiVoiceChanType),channel_count);
+  if(*pChan == NULL)
+  {
+#ifdef ENABLE_DEBUG
+    LOGPRINT("%s%s: failed to allocate memory", LOGPRINT_PREFIX, __FUNCTION__);
+#endif
+    return RC_NO_MEM;
+  }
+  return RC_NONE;
+#else
+  SILABS_UNREFERENCED_PARAMETER(pChan);
+  SILABS_UNREFERENCED_PARAMETER(channel_count);
+  return RC_UNSUPPORTED_FEATURE;
+#endif
+}
+
+int SiVoice_destroyChannels (SiVoiceChanType_ptr *hProslic)
+{
+
+  TRACEPRINT_NOCHAN("\n",NULL);
+#ifndef DISABLE_MALLOC
+  if(hProslic && *hProslic)
+  {
+    SIVOICE_FREE ((SiVoiceChanType_ptr)*hProslic);
+    *hProslic = NULL;
+  }
+  return RC_NONE;
+#else
+  SILABS_UNREFERENCED_PARAMETER(hProslic);
+  return RC_UNSUPPORTED_FEATURE;
+#endif
+}
+
+/*
+** Host control linkage
+*/
+int SiVoice_setControlInterfaceCtrlObj (SiVoiceControlInterfaceType *pCtrlIntf,
+                                        void *hCtrl)
+{
+  TRACEPRINT_NOCHAN("\n",NULL);
+  pCtrlIntf->hCtrl = hCtrl;
+  return RC_NONE;
+}
+
+/*
+** Host reset linkage
+*/
+int SiVoice_setControlInterfaceReset (SiVoiceControlInterfaceType *pCtrlIntf,
+                                      ctrl_Reset_fptr Reset_fptr)
+{
+  TRACEPRINT_NOCHAN("\n",NULL);
+  pCtrlIntf->Reset_fptr = Reset_fptr;
+  return RC_NONE;
+}
+
+/*
+** Host register/RAM read/write linkage
+*/
+int SiVoice_setControlInterfaceWriteRegister (SiVoiceControlInterfaceType
+    *pCtrlIntf, ctrl_WriteRegister_fptr WriteRegister_fptr)
+{
+  TRACEPRINT_NOCHAN("\n",NULL);
+  pCtrlIntf->WriteRegister_fptr = WriteRegister_fptr;
+  return RC_NONE;
+}
+
+int SiVoice_setControlInterfaceReadRegister (SiVoiceControlInterfaceType
+    *pCtrlIntf, ctrl_ReadRegister_fptr ReadRegister_fptr)
+{
+  TRACEPRINT_NOCHAN("\n",NULL);
+  pCtrlIntf->ReadRegister_fptr = ReadRegister_fptr;
+  return RC_NONE;
+}
+
+int SiVoice_setControlInterfaceWriteRAM (SiVoiceControlInterfaceType *pCtrlIntf,
+    ctrl_WriteRAM_fptr WriteRAM_fptr)
+{
+  TRACEPRINT_NOCHAN("\n",NULL);
+  pCtrlIntf->WriteRAM_fptr = WriteRAM_fptr;
+  return RC_NONE;
+}
+
+int SiVoice_setControlInterfaceReadRAM (SiVoiceControlInterfaceType *pCtrlIntf,
+                                        ctrl_ReadRAM_fptr ReadRAM_fptr)
+{
+  TRACEPRINT_NOCHAN("\n",NULL);
+  pCtrlIntf->ReadRAM_fptr = ReadRAM_fptr;
+  return RC_NONE;
+}
+
+/*
+** Host timer linkage
+*/
+int SiVoice_setControlInterfaceTimerObj (SiVoiceControlInterfaceType *pCtrlIntf,
+    void *hTimer)
+{
+  TRACEPRINT_NOCHAN("\n",NULL);
+  pCtrlIntf->hTimer = hTimer;
+  return RC_NONE;
+}
+
+int SiVoice_setControlInterfaceDelay (SiVoiceControlInterfaceType *pCtrlIntf,
+                                      system_delay_fptr Delay_fptr)
+{
+  TRACEPRINT_NOCHAN("\n",NULL);
+  pCtrlIntf->Delay_fptr = Delay_fptr;
+  return RC_NONE;
+}
+
+int SiVoice_setControlInterfaceSemaphore (SiVoiceControlInterfaceType
+    *pCtrlIntf, ctrl_Semaphore_fptr semaphore_fptr)
+{
+  TRACEPRINT_NOCHAN("\n",NULL);
+  pCtrlIntf->Semaphore_fptr = semaphore_fptr;
+  return RC_NONE;
+}
+
+int SiVoice_setControlInterfaceTimeElapsed (SiVoiceControlInterfaceType
+    *pCtrlIntf, system_timeElapsed_fptr timeElapsed_fptr)
+{
+  TRACEPRINT_NOCHAN("\n",NULL);
+  pCtrlIntf->timeElapsed_fptr = timeElapsed_fptr;
+  return RC_NONE;
+}
+
+int SiVoice_setControlInterfaceGetTime (SiVoiceControlInterfaceType *pCtrlIntf,
+                                        system_getTime_fptr getTime_fptr)
+{
+  TRACEPRINT_NOCHAN("\n",NULL);
+  pCtrlIntf->getTime_fptr = getTime_fptr;
+  return RC_NONE;
+}
+
+/*
+** Channel object initialization
+*/
+int SiVoice_SWInitChan (SiVoiceChanType_ptr pChan,int channel,int chipType,
+                        SiVoiceDeviceType *pDeviceObj, SiVoiceControlInterfaceType *pCtrlIntf)
+{
+  TRACEPRINT_NOCHAN( "channel = %d chipType = %d\n", channel, chipType);
+  pChan->channel = (uInt8)channel;
+  pChan->deviceId = pDeviceObj;
+  pChan->deviceId->ctrlInterface = pCtrlIntf;
+  pChan->channelEnable=1;
+  pChan->error = RC_NONE;
+  pChan->debugMode = 0;
+  pChan->dcdc_polarity_invert = 0;
+#ifdef PROSLIC_BOM_DEFAULT
+  pChan->bomOption = PROSLIC_BOM_DEFAULT;
+#else
+  pChan->bomOption = 0;
+#endif
+
+  switch (chipType)
+  {
+    case SI3217X_TYPE:
+      pChan->deviceId->chipType = SI32171;
+      break;
+
+    case SI3218X_TYPE:
+      pChan->deviceId->chipType = SI32180;
+      break;
+
+    case SI3219X_TYPE:
+      pChan->deviceId->chipType = SI32190;
+      break;
+
+    case SI3226X_TYPE:
+      pChan->deviceId->chipType = SI32260;
+      break;
+
+    case SI3228X_TYPE:
+      pChan->deviceId->chipType = SI32280;
+      break;
+
+    case SI3050_TYPE:
+      pChan->deviceId->chipType = SI3050;
+      break;
+
+    default:
+      return RC_UNSUPPORTED_FEATURE;
+  }
+  return RC_NONE;
+}
+
+/*
+** Reset control
+*/
+int SiVoice_Reset (SiVoiceChanType_ptr pChan)
+{
+  TRACEPRINT_NOCHAN( "\n", NULL);
+  /*
+  ** assert reset, wait 250ms, release reset, wait 250ms
+  */
+  pChan->deviceId->ctrlInterface->Reset_fptr(
+    pChan->deviceId->ctrlInterface->hCtrl,1);
+
+  pChan->deviceId->ctrlInterface->Delay_fptr(
+    pChan->deviceId->ctrlInterface->hTimer,250);
+
+  pChan->deviceId->ctrlInterface->Reset_fptr(
+    pChan->deviceId->ctrlInterface->hCtrl,0);
+
+  pChan->deviceId->ctrlInterface->Delay_fptr(
+    pChan->deviceId->ctrlInterface->hTimer,250);
+
+  return RC_NONE;
+}
+
+/*
+** Debug Mode Control
+*/
+int SiVoice_setSWDebugMode (SiVoiceChanType_ptr pChan, int debugEn)
+{
+#ifdef ENABLE_DEBUG
+  TRACEPRINT_NOCHAN( "debugEn %d\n", debugEn);
+  pChan->debugMode = (0xFE & pChan->debugMode) | (debugEn != 0);
+#else
+  SILABS_UNREFERENCED_PARAMETER(pChan);
+  SILABS_UNREFERENCED_PARAMETER(debugEn);
+#endif
+  return RC_NONE;
+}
+
+/*
+** Trace Mode Control
+*/
+int SiVoice_setTraceMode (SiVoiceChanType_ptr pChan, int traceEn)
+{
+#ifdef ENABLE_TRACES
+  TRACEPRINT_NOCHAN( "debugEn %d\n", traceEn);
+  pChan->debugMode = (0xFD & pChan->debugMode) | ((traceEn != 0)<<1);
+#else
+  SILABS_UNREFERENCED_PARAMETER(pChan);
+  SILABS_UNREFERENCED_PARAMETER(traceEn);
+#endif
+  return RC_NONE;
+}
+
+/*
+** Error status
+*/
+int SiVoice_getErrorFlag (SiVoiceChanType_ptr pChan, int *error)
+{
+  TRACEPRINT( pChan, "\n", NULL);
+  *error = pChan->error;
+  return RC_NONE;
+}
+
+int SiVoice_clearErrorFlag (SiVoiceChanType_ptr pChan)
+{
+  TRACEPRINT( pChan, "\n", NULL);
+  pChan->error = RC_NONE;
+  return RC_NONE;
+}
+
+/*
+** Channel status
+*/
+int SiVoice_setChannelEnable (SiVoiceChanType_ptr pChan, int chanEn)
+{
+  TRACEPRINT( pChan, "enable = %d\n", chanEn);
+  pChan->channelEnable = chanEn;
+  return RC_NONE;
+}
+
+int SiVoice_getChannelEnable (SiVoiceChanType_ptr pChan, int *chanEn)
+{
+  TRACEPRINT( pChan, "\n", NULL);
+  *chanEn = pChan->channelEnable;
+  return RC_NONE;
+}
+
+uInt8 SiVoice_ReadReg(SiVoiceChanType_ptr hProslic,uInt8 addr)
+{
+  TRACEPRINT( hProslic, "addr = %u\n", (unsigned int)addr);
+  return ReadReg(hProslic, hProslic->channel, addr);
+}
+
+int SiVoice_WriteReg(SiVoiceChanType_ptr hProslic,uInt8 addr,uInt8 data)
+{
+  TRACEPRINT( hProslic, "addr = %u data = 0x%02X\n", (unsigned int)addr,
+              (unsigned int) data);
+  return WriteReg(hProslic, hProslic->channel, addr, data);
+}
+
+/*****************************************************************************************************/
+#if defined(SI3217X) || defined(SI3218X) || defined(SI3219X) || defined(SI3226X) || defined(SI3228X) 
+#include "../inc/proslic.h"
+
+/* Iterate through the number of channels to determine if it's a SLIC, DAA, or unknown. Rev ID and chiptype is
+ * also filled in.
+ */
+int SiVoice_IdentifyChannels(SiVoiceChanType_ptr *pProslic, int size,
+                             int *slicCount, int *daaCount)
+{
+  int i;
+  int rc = RC_NONE;
+  SiVoiceChanType_ptr currentChannel;
+
+  TRACEPRINT( *pProslic, "size = %d\n", size);
+
+  if(slicCount)
+  {
+    *slicCount = 0;
+  }
+  if(daaCount)
+  {
+    *daaCount = 0;
+  }
+
+  for(i = 0; i < size; i++)
+  {
+    currentChannel = pProslic[i];
+    /* SiVoice_SWInitChan() fills in the chipType initially with something the user provided, fill it
+     * in with the correct info.. The GetChipInfo may probe registers to compare them with their
+     * initial values, so this function MUST only be called after a chipset reset.
+     */
+#ifdef SI3217X
+    if (currentChannel->deviceId->chipType >= SI32171
+        && currentChannel->deviceId->chipType <= SI32179)
+    {
+      rc = Si3217x_GetChipInfo(currentChannel);
+    }
+#endif
+
+#ifdef SI3218X
+    if (currentChannel->deviceId->chipType >= SI32180
+        && currentChannel->deviceId->chipType <= SI32189)
+    {
+      rc = Si3218x_GetChipInfo(currentChannel);
+    }
+#endif
+
+#ifdef SI3219X
+    if ( IS_SI3219X(currentChannel->deviceId) )
+    {
+      rc = Si3219x_GetChipInfo(currentChannel);
+    }
+#endif
+
+#ifdef SI3226X
+    if (currentChannel->deviceId->chipType >= SI32260
+        && currentChannel->deviceId->chipType <= SI32269)
+    {
+      rc = Si3226x_GetChipInfo(currentChannel);
+    }
+#endif
+
+#ifdef SI3228X
+    if (currentChannel->deviceId->chipType >= SI32280
+        && currentChannel->deviceId->chipType <= SI32289)
+    {
+      rc = Si3228x_GetChipInfo(currentChannel);
+    }
+#endif
+
+    if(rc != RC_NONE)
+    {
+      return rc;
+    }
+
+    currentChannel->channelType = ProSLIC_identifyChannelType(currentChannel);
+    if(currentChannel->channelType == PROSLIC)
+    {
+      if(slicCount)
+      {
+        (*slicCount)++;
+      }
+    }
+    else if(currentChannel->channelType == DAA)
+    {
+      if(daaCount)
+      {
+        (*daaCount)++;
+      }
+    }
+#ifdef ENABLE_DEBUG
+    {
+      const char *dev_type = "UNKNOWN";
+      if(currentChannel->channelType == PROSLIC)
+      {
+        dev_type = "PROSLIC";
+      }
+      else if(currentChannel->channelType == DAA)
+      {
+        dev_type = "DAA";
+      }
+      LOGPRINT("%sChannel %d: Type = %s Rev = %d\n",
+               LOGPRINT_PREFIX, currentChannel->channel, dev_type,
+               currentChannel->deviceId->chipRev);
+
+    }
+#endif /* ENABLE_DEBUG */
+  }
+  return RC_NONE;
+}
+#endif
+
+/*
+** Function: ProSLIC_Version
+**
+** Description:
+** Return API version
+**
+** Returns:
+** string of the API release.
+*/
+
+extern const char *SiVoiceAPIVersion;
+char *SiVoice_Version()
+{
+  return (char *)SiVoiceAPIVersion;
+}
+
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/src/si_voice_version.c b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/src/si_voice_version.c
new file mode 100644
index 0000000..5d4aaaa
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/src/si_voice_version.c
@@ -0,0 +1,21 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * file: si_voice_version.c
+ *
+ * Distributed by: 
+ * Silicon Laboratories, Inc
+ *
+ * This file contains proprietary information.	 
+ * No dissemination allowed without prior written permission from
+ * Silicon Laboratories, Inc.
+ * 
+ * THIS FILE IS AUTOGENERATED - DO NOT MODIFY
+ *
+ */
+
+
+
+char *SiVoiceAPIVersion = "9.2.0";
+
+
+
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/src/vdaa.c b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/src/vdaa.c
new file mode 100644
index 0000000..9a73c44
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/src/vdaa.c
@@ -0,0 +1,1350 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Vdaa  VoiceDAA interface implementation file
+ *
+ * Distributed by:
+ * Silicon Laboratories, Inc
+ *
+ * This file contains proprietary information.
+ * No dissemination allowed without prior written permission from
+ * Silicon Laboratories, Inc.
+ *
+ * File Description:
+ * This is the implementation file for the main VoiceDAA API.
+ *
+ */
+
+#include "../config_inc/si_voice_datatypes.h"
+#include "../inc/si_voice_ctrl.h"
+#include "../inc/si_voice_timer_intf.h"
+#include "../inc/vdaa.h"
+#include "../inc/vdaa_registers.h"
+#include "../config_inc/vdaa_api_config.h"
+
+#define WriteReg      pVdaa->deviceId->ctrlInterface->WriteRegister_fptr
+#define ReadReg        pVdaa->deviceId->ctrlInterface->ReadRegister_fptr
+#define pVdaaHW        pVdaa->deviceId->ctrlInterface->hCtrl
+
+#define WriteRegX      deviceId->ctrlInterface->WriteRegister_fptr
+#define ReadRegX      deviceId->ctrlInterface->ReadRegister_fptr
+#define pVdaaHWX      deviceId->ctrlInterface->hCtrl
+#define LOGPRINT_PREFIX "VDAA: "
+
+/*
+** Static VDAA driver functions
+*/
+
+/*
+** Function: isVerifiedDAA
+**
+** Description:
+** Verifies addressed channel is DAA
+**
+** Input Parameters:
+** pVdaa: pointer to SiVoiceChanType or vdaaChanType
+**
+** Return:
+** Verified DAA
+** Not DAA          RC_CHANNEL_TYPE_ERR
+**
+*/
+
+static int isVerifiedDAA(vdaaChanType *pVdaa)
+{
+  uInt8 data = ReadReg(pVdaaHW,pVdaa->channel,LSIDE_REV);
+  if ( (data & 0x40) == 0 ) /*This bit is always 1 for DAA*/
+  {
+    LOGPRINT("%sDAA device not detected\n",LOGPRINT_PREFIX);
+    return RC_CHANNEL_TYPE_ERR;
+  }
+  else
+  {
+    /* For Si3050, the value will be zero initially (calloc), for Si32178/9, this will
+     * be non-zero (Rev B).
+     */
+    if(pVdaa->deviceId->chipRev == 0)
+    {
+      /* Read Device ID and store it */
+      /* NOTE: in earlier releases we also read the line side info here.  This is now done
+         Vdaa_duringPowerUpLineside since the information we read was always 0.
+       */
+      data = pVdaa->ReadRegX(pVdaa->pVdaaHWX,pVdaa->channel,SYS_LINE_DEV_REV);
+      pVdaa->deviceId->chipRev= data&0xF;
+#ifdef ENABLE_DEBUG
+      LOGPRINT("%sChipRev = 0x%x\n", LOGPRINT_PREFIX, pVdaa->deviceId->chipRev);
+#endif
+    }
+  }
+
+  return RC_NONE;
+}
+
+#if 0 /* Removed for now since it isn't used, keeping code as reference */
+/*
+** Function: probeDaisyChain
+**
+** Description:
+** Identify how many VDAA devices are in daisychain
+** Only called if channel 0 has be previously qualified
+** as a VDAA.
+**
+** Input Parameters:
+** pVdaa:       pointer to SiVoiceChanType or vdaaChanType
+**
+** Return:
+** number of channels in daisy chain
+**
+*/
+
+static int probeDaisyChain (vdaaChanType *pVdaa)
+{
+  int i=0;
+  WriteReg(pVdaaHW,BROADCAST,PCMRX_CNT_LO,0x23);        /* Broadcast */
+  while ((ReadReg(pVdaaHW,(uInt8)i++,PCMRX_CNT_LO) == 0x23)
+         &&(i<=16));  /* Count number of channels */
+  return i-1;                          /* Return number of channels */
+}
+#endif
+
+/*
+**
+**  ------ VDAA CONFIGURATION FUNCTIONS -----
+**
+*/
+
+/*
+** Function:  Vdaa_RingDetectSetup
+**
+** Description:
+** configure ring detect setup
+**
+** Returns:
+**
+*/
+
+#ifndef DISABLE_VDAA_RING_DETECT_SETUP
+extern vdaa_Ring_Detect_Cfg Vdaa_Ring_Detect_Presets[];
+int Vdaa_RingDetectSetup (vdaaChanType *pVdaa,int32 preset)
+{
+
+  uInt8 regTemp = 0;
+  TRACEPRINT( pVdaa, "preset = %d\n", (unsigned int) preset);
+  if(pVdaa->channelType != DAA)
+  {
+    return RC_IGNORE;
+  }
+
+  regTemp = ReadReg(pVdaaHW,pVdaa->channel,CTRL2) & 0xfB;
+  regTemp |= Vdaa_Ring_Detect_Presets[preset].rdi<<2;
+  WriteReg(pVdaaHW,pVdaa->channel,CTRL2,regTemp);
+
+  regTemp = ReadReg(pVdaaHW,pVdaa->channel,INTL_CTRL1) & 0xfe;
+  regTemp |= Vdaa_Ring_Detect_Presets[preset].rt&1;
+  WriteReg(pVdaaHW,pVdaa->channel,INTL_CTRL1,regTemp);
+
+  regTemp = ReadReg(pVdaaHW,pVdaa->channel,INTL_CTRL2) & 0xef;
+  regTemp |= ((Vdaa_Ring_Detect_Presets[preset].rt>>1)<<4);
+  WriteReg(pVdaaHW,pVdaa->channel,INTL_CTRL2,regTemp);
+
+  WriteReg(pVdaaHW,pVdaa->channel,INTL_CTRL3,
+           Vdaa_Ring_Detect_Presets[preset].rfwe<<1);
+
+  regTemp = (Vdaa_Ring_Detect_Presets[preset].rdly&0x3) << 6;
+  regTemp |= Vdaa_Ring_Detect_Presets[preset].rmx ;
+  WriteReg(pVdaaHW,pVdaa->channel,RNG_VLD_CTRL1,regTemp);
+
+  regTemp = (Vdaa_Ring_Detect_Presets[preset].rdly>>2) << 7;
+  regTemp |= Vdaa_Ring_Detect_Presets[preset].rto << 3 ;
+  regTemp |= Vdaa_Ring_Detect_Presets[preset].rcc ;
+  WriteReg(pVdaaHW,pVdaa->channel,RNG_VLD_CTRL2,regTemp);
+
+  regTemp = Vdaa_Ring_Detect_Presets[preset].rngv << 7;
+  regTemp |= Vdaa_Ring_Detect_Presets[preset].ras ;
+  WriteReg(pVdaaHW,pVdaa->channel,RNG_VLD_CTRL3,regTemp);
+
+  regTemp = Vdaa_Ring_Detect_Presets[preset].rpol<<1;
+  WriteReg(pVdaaHW,pVdaa->channel,DAA_CTRL4,regTemp);
+
+  return RC_NONE;
+}
+#endif
+
+/*
+** Function:  Vdaa_TXAudioGainSetup
+**
+** Description:
+** configure tx audio gain
+**
+** Returns:
+**
+**
+*/
+#ifndef DISABLE_VDAA_AUDIO_GAIN_SETUP
+extern vdaa_audioGain_Cfg Vdaa_audioGain_Presets[];
+
+int Vdaa_TXAudioGainSetup (vdaaChanType *pVdaa,int32 preset)
+{
+  uInt8 regTemp = 0;
+  TRACEPRINT( pVdaa, "preset = %d\n", (unsigned int) preset);
+
+  if(pVdaa->channelType != DAA)
+  {
+    return RC_IGNORE;
+  }
+
+  if(Vdaa_audioGain_Presets[preset].xga2 == XGA_ATTEN)
+  {
+    regTemp = 0x10;
+  }
+
+  regTemp |= Vdaa_audioGain_Presets[preset].acgain2 ;
+  WriteReg(pVdaaHW,pVdaa->channel,TX_GN_CTRL2,regTemp);
+
+  regTemp = 0;
+  if(Vdaa_audioGain_Presets[preset].xga3 == XGA_ATTEN)
+  {
+    regTemp = 0x10 ;
+  }
+
+  regTemp |= Vdaa_audioGain_Presets[preset].acgain3 ;
+  WriteReg(pVdaaHW,pVdaa->channel,TX_GN_CTRL3,regTemp);
+
+  if(Vdaa_audioGain_Presets[preset].cpEn)
+  {
+    WriteReg(pVdaaHW,pVdaa->channel,TXCALL_PROG_ATTEN,
+             Vdaa_audioGain_Presets[preset].callProgress);
+  }
+
+  return RC_NONE;
+}
+# endif
+
+
+/*
+** Function:  Vdaa_RXAudioGainSetup
+**
+** Description:
+** configure rx audio gain
+**
+** Returns:
+**
+**
+*/
+#ifndef DISABLE_VDAA_AUDIO_GAIN_SETUP
+extern vdaa_audioGain_Cfg Vdaa_audioGain_Presets[];
+
+int Vdaa_RXAudioGainSetup (vdaaChanType *pVdaa,int32 preset)
+{
+  uInt8 regTemp = 0;
+
+  TRACEPRINT( pVdaa, "preset = %d\n", (unsigned int) preset);
+  if(pVdaa->channelType != DAA)
+  {
+    return RC_IGNORE;
+  }
+
+  if(Vdaa_audioGain_Presets[preset].xga2 == XGA_ATTEN)
+  {
+    regTemp = 0x10;
+  }
+  regTemp |= Vdaa_audioGain_Presets[preset].acgain2 ;
+  WriteReg(pVdaaHW,pVdaa->channel,RX_GN_CTRL2,regTemp);
+
+  regTemp = 0;
+  if(Vdaa_audioGain_Presets[preset].xga3 == XGA_ATTEN)
+  {
+    regTemp = 0x10;
+  }
+  regTemp |= Vdaa_audioGain_Presets[preset].acgain3 ;
+  WriteReg(pVdaaHW,pVdaa->channel,RX_GN_CTRL3,regTemp);
+
+  if(Vdaa_audioGain_Presets[preset].cpEn)
+  {
+    WriteReg(pVdaaHW,pVdaa->channel,RXCALL_PROG_ATTEN,
+             Vdaa_audioGain_Presets[preset].callProgress);
+  }
+
+  return RC_NONE;
+}
+#endif
+
+
+/*
+** Function:  Vdaa_PCMSetup
+**
+** Description:
+** configure pcm format, clocking and edge placement
+**
+** Returns:
+**
+**
+*/
+#ifndef DISABLE_VDAA_PCM_SETUP
+extern vdaa_PCM_Cfg Vdaa_PCM_Presets [];
+
+int Vdaa_PCMSetup (vdaaChanType *pVdaa,int32 preset)
+{
+  uInt8 regTemp = 0;
+
+  TRACEPRINT( pVdaa, "preset = %d\n", (unsigned int) preset);
+  if(pVdaa->channelType != DAA)
+  {
+    return RC_IGNORE;
+  }
+
+  regTemp = ReadReg(pVdaaHW,pVdaa->channel,PCM_SPI_CTRL)&0xe0;
+  regTemp |= Vdaa_PCM_Presets[preset].pcm_tri;
+  regTemp |= Vdaa_PCM_Presets[preset].pcmHwy << 1;
+  regTemp |= Vdaa_PCM_Presets[preset].pcmFormat << 3;
+  WriteReg(pVdaaHW,pVdaa->channel,PCM_SPI_CTRL,regTemp);
+
+  return RC_NONE;
+}
+#endif
+
+/*
+** Function:  Vdaa_PCMTimeSlotSetup
+**
+** Description:
+** configure pcm timeslot
+**
+** Returns:
+**
+*/
+int Vdaa_PCMTimeSlotSetup (vdaaChanType *pVdaa, uInt16 rxcount, uInt16 txcount)
+{
+  uInt8 data = 0;
+  uInt8 pcmStatus;
+
+  TRACEPRINT( pVdaa, "rxcount = %u txcount = %u\n", (unsigned int)rxcount,
+              (unsigned int)txcount);
+  if(pVdaa->channelType != DAA)
+  {
+    return RC_IGNORE;
+  }
+
+  /* Disable PCM if enabled - restore after updating timeslots */
+  pcmStatus = ReadReg(pVdaaHW,pVdaa->channel,PCM_SPI_CTRL);
+  if (pcmStatus&0x20)
+  {
+    WriteReg(pVdaaHW,pVdaa->channel,PCM_SPI_CTRL,pcmStatus&~(0x20));
+  }
+
+  /*Storing 10 bit value of Transmit PCM sample in REG 34 and REG 35[0:1]*/
+  data = (uInt8)(txcount & 0xff);
+  WriteReg(pVdaaHW,pVdaa->channel,PCMTX_CNT_LO,data);
+  data = (uInt8)(txcount >> 8) ;
+  WriteReg(pVdaaHW,pVdaa->channel,PCMTX_CNT_HI,data);
+
+  /*Storing 10 bit value of Receive PCM sample in REG 34 and REG 35[0:1]*/
+  data = (uInt8)(rxcount & 0xff);
+  WriteReg(pVdaaHW,pVdaa->channel,PCMRX_CNT_LO,data);
+  data = (uInt8)(rxcount >> 8);
+  WriteReg(pVdaaHW,pVdaa->channel,PCMRX_CNT_HI,data);
+
+  /* Enable back the PCM after storing the values*/
+  WriteReg(pVdaaHW,pVdaa->channel,PCM_SPI_CTRL,pcmStatus);
+
+  return RC_NONE;
+}
+
+/*
+** Function:  Vdaa_CountrySetup
+**
+** Description:
+** configure country specific settings
+**
+** Returns:
+**
+**
+*/
+
+#ifndef DISABLE_VDAA_COUNTRY_SETUP
+extern vdaa_Country_Cfg Vdaa_Country_Presets [];
+
+int Vdaa_CountrySetup (vdaaChanType *pVdaa,int32 preset)
+{
+  uInt8 regTemp = 0;
+
+  TRACEPRINT( pVdaa, "preset = %d\n", (unsigned int) preset);
+  if(pVdaa->channelType != DAA)
+  {
+    return RC_IGNORE;
+  }
+
+  regTemp = ReadReg(pVdaaHW,pVdaa->channel,CTRL2) & 0xFD;
+  WriteReg(pVdaaHW,pVdaa->channel,CTRL2,regTemp); /* disable hybrid */
+
+  regTemp = ReadReg(pVdaaHW,pVdaa->channel,INTL_CTRL1) & 0xFD;
+  regTemp |= Vdaa_Country_Presets[preset].rz << 1 ;
+  WriteReg(pVdaaHW,pVdaa->channel,INTL_CTRL1,regTemp);
+
+  regTemp = Vdaa_Country_Presets[preset].dcr;
+  regTemp |= Vdaa_Country_Presets[preset].ilim<<1;
+  regTemp |= Vdaa_Country_Presets[preset].mini<<4;
+  regTemp |= Vdaa_Country_Presets[preset].dcv<<6;
+  WriteReg(pVdaaHW,pVdaa->channel,DC_TERM_CTRL,regTemp);
+
+  regTemp = ReadReg(pVdaaHW,pVdaa->channel,AC_TERM_CTRL) & 0xF0;
+  regTemp |= Vdaa_Country_Presets[preset].acim;
+  WriteReg(pVdaaHW,pVdaa->channel,AC_TERM_CTRL,regTemp);
+
+  regTemp = ReadReg(pVdaaHW,pVdaa->channel,SPRK_QNCH_CTRL) & 0xAF;
+  regTemp |= ((Vdaa_Country_Presets[preset].ohs_sq >> 2)&1)<<4 ;
+  regTemp |= ((Vdaa_Country_Presets[preset].ohs_sq >> 3)&1)<<6 ;
+  WriteReg(pVdaaHW,pVdaa->channel,SPRK_QNCH_CTRL,regTemp);
+
+  regTemp = ReadReg(pVdaaHW,pVdaa->channel,INTL_CTRL1) & 0xBF;
+  regTemp |= ((Vdaa_Country_Presets[preset].ohs_sq >> 1)&1)<<6 ;
+  WriteReg(pVdaaHW,pVdaa->channel,INTL_CTRL1,regTemp);
+
+  regTemp = ReadReg(pVdaaHW,pVdaa->channel,DAA_CTRL5) & 0xE7;
+  regTemp |= (Vdaa_Country_Presets[preset].ohs_sq&1)<<3 ;
+  WriteReg(pVdaaHW,pVdaa->channel,DAA_CTRL5,regTemp);
+
+  regTemp = ReadReg(pVdaaHW,pVdaa->channel,CTRL2) & 0xFD;
+  regTemp |= (Vdaa_Country_Presets[preset].hbe)<<1 ;
+  WriteReg(pVdaaHW,pVdaa->channel,CTRL2,regTemp);
+
+  return RC_NONE;
+}
+#endif
+
+/*
+** Function:  Vdaa_HybridSetup
+**
+** Description:
+** configure hybrid
+**
+*/
+
+#ifndef DISABLE_VDAA_HYBRID_SETUP
+extern vdaa_Hybrid_Cfg Vdaa_Hybrid_Presets [];
+
+int Vdaa_HybridSetup (vdaaChanType *pVdaa,int32 preset)
+{
+  uInt8 regSave = 0;
+
+  TRACEPRINT( pVdaa, "preset = %d\n", (unsigned int) preset);
+  if(pVdaa->channelType != DAA)
+  {
+    return RC_IGNORE;
+  }
+
+  regSave = ReadReg(pVdaaHW,pVdaa->channel,CTRL2);
+  WriteReg(pVdaaHW,pVdaa->channel,CTRL2,regSave&0xFD); /* disable hybrid */
+
+  WriteReg(pVdaaHW,pVdaa->channel,HYB1,Vdaa_Hybrid_Presets[preset].hyb1);
+  WriteReg(pVdaaHW,pVdaa->channel,HYB2,Vdaa_Hybrid_Presets[preset].hyb2);
+  WriteReg(pVdaaHW,pVdaa->channel,HYB3,Vdaa_Hybrid_Presets[preset].hyb3);
+  WriteReg(pVdaaHW,pVdaa->channel,HYB4,Vdaa_Hybrid_Presets[preset].hyb4);
+  WriteReg(pVdaaHW,pVdaa->channel,HYB5,Vdaa_Hybrid_Presets[preset].hyb5);
+  WriteReg(pVdaaHW,pVdaa->channel,HYB6,Vdaa_Hybrid_Presets[preset].hyb6);
+  WriteReg(pVdaaHW,pVdaa->channel,HYB7,Vdaa_Hybrid_Presets[preset].hyb7);
+  WriteReg(pVdaaHW,pVdaa->channel,HYB8,Vdaa_Hybrid_Presets[preset].hyb8);
+
+  WriteReg(pVdaaHW,pVdaa->channel,CTRL2,
+           regSave); /* Restore hybrid enable state at entry */
+
+  return RC_NONE;
+}
+#endif
+
+/*
+** Function:  Vdaa_SetAudioMute
+**
+** Description:
+** Control RX and TX mute
+**
+*/
+
+int Vdaa_SetAudioMute(vdaaChanType *pVdaa, tMUTE mute)
+{
+  uInt8 regData;
+
+  TRACEPRINT( pVdaa, "mode = %u\n", (unsigned int) mute);
+  if(pVdaa->channelType != DAA)
+  {
+    return RC_IGNORE;
+  }
+
+  regData = ReadReg(pVdaaHW,pVdaa->channel,TXRX_GN_CTRL);
+
+  switch(mute)
+  {
+    case MUTE_DISABLE_ALL:
+      regData = 0;
+      break;
+
+    case MUTE_DISABLE_RX:
+      regData &= 0x80;
+      break;
+
+    case MUTE_DISABLE_TX:
+      regData &= 0x08;
+      break;
+
+    case MUTE_ENABLE_RX:
+      regData |= 0x08;
+      break;
+
+    case MUTE_ENABLE_TX:
+      regData |= 0x80;
+      break;
+
+    case MUTE_ENABLE_ALL:
+      regData = 0x88;
+      break;
+  }
+
+  WriteReg(pVdaaHW,pVdaa->channel,TXRX_GN_CTRL,regData);
+
+  return RC_NONE;
+}
+
+/*
+** Function:  Vdaa_PCMStart
+**
+** Description:
+** Enables PCM bus
+**
+*/
+
+int Vdaa_PCMStart (vdaaChanType *pVdaa)
+{
+  uInt8 data = 0;
+
+  TRACEPRINT( pVdaa, "\n", NULL);
+  if(pVdaa->channelType != DAA)
+  {
+    return RC_IGNORE;
+  }
+
+  /*Enable PCM transfers by setting REG 33[5]=1 */
+  data = ReadReg(pVdaaHW,pVdaa->channel,PCM_SPI_CTRL);
+  data |= 0x20;
+  WriteReg(pVdaaHW,pVdaa->channel,PCM_SPI_CTRL,data);
+  return RC_NONE;
+}
+
+/*
+** Function:  Vdaa_PCMStop
+**
+** Description:
+** Disables PCM bus
+**
+*/
+
+int Vdaa_PCMStop (vdaaChanType *pVdaa)
+{
+  uInt8 data = 0;
+
+  TRACEPRINT( pVdaa, "\n", NULL);
+  if(pVdaa->channelType != DAA)
+  {
+    return RC_IGNORE;
+  }
+
+  /*disable PCM transfers by setting REG 33[5]=0 */
+  data = ReadReg(pVdaaHW,pVdaa->channel,PCM_SPI_CTRL);
+  data &= ~(0x20);
+  WriteReg(pVdaaHW,pVdaa->channel,PCM_SPI_CTRL,data);
+  return RC_NONE;
+}
+
+/*
+** Function:  Vdaa_SetInterruptMask
+**
+** Description:
+** Enables interrupts based on passed 9-bit bitmask.  Bit
+** values defined by vdaaIntMask enum.
+**
+*/
+
+int Vdaa_SetInterruptMask(vdaaChanType *pVdaa, vdaaIntMask bitmask)
+{
+  uInt8 intMaskReg = 0;
+  uInt8 cviReg = 0;
+
+  TRACEPRINT( pVdaa, "mask = 0x%03x\n", (unsigned int)bitmask);
+  /* Channel validation */
+  if(pVdaa->channelType != DAA)
+  {
+    return RC_CHANNEL_TYPE_ERR;
+  }
+
+  intMaskReg = (uInt8)(bitmask & 0x00ff);
+  cviReg = ReadReg(pVdaaHW,pVdaa->channel,LN_VI_THRESH_INTE_CTRL);
+  cviReg |= (uInt8) ((bitmask >> 7) & 0x0002);
+
+  WriteReg (pVdaaHW,pVdaa->channel,INTE_MSK,intMaskReg);
+  WriteReg(pVdaaHW,pVdaa->channel,LN_VI_THRESH_INTE_CTRL,cviReg);
+
+  return RC_NONE;
+}
+
+/*
+** Function:  Vdaa_ReadRingDetectStatus
+**
+** Description:
+** Reads ring detect/hook status
+**
+** Returns:
+**
+**
+*/
+
+int Vdaa_ReadRingDetectStatus (vdaaChanType *pVdaa,
+                               vdaaRingDetectStatusType *pStatus)
+{
+  uInt8 reg;
+
+  TRACEPRINT( pVdaa, "\n", NULL);
+  if(pVdaa->channelType != DAA)
+  {
+    return RC_IGNORE;
+  }
+
+  reg = ReadReg(pVdaaHW,pVdaa->channel,DAA_CTRL1);
+  pStatus->offhook = reg & 0x01;
+  pStatus->ringDetected = (reg & 0x4)>>2;
+  pStatus->onhookLineMonitor = (reg & 0x8)>>3;
+  pStatus->ringDetectedPos = (reg & 0x20)>>5;
+  pStatus->ringDetectedNeg = (reg & 0x40)>>6;
+  return RC_NONE;
+}
+
+/*
+** Function:  Vdaa_Init
+**
+** Description:
+** Initialize VDAA, load general config parameters
+**
+*/
+
+extern vdaa_General_Cfg Vdaa_General_Configuration;
+
+int Vdaa_Init (vdaaChanType_ptr *pVdaa,int size)
+{
+  uInt8 data;
+  int k;
+  int num_devices = 0;
+
+  TRACEPRINT( *pVdaa, "size = %d\n", size);
+
+  for (k=0; k<size; k++)
+  {
+
+    if(pVdaa[k]->channelType == PROSLIC)
+    {
+      continue;  /* Skip if we know this is a ProSLIC, else check the device out */
+    }
+
+    if (isVerifiedDAA(pVdaa[k]) == RC_CHANNEL_TYPE_ERR)
+    {
+      pVdaa[k]->channelEnable = FALSE;
+      pVdaa[k]->error = RC_CHANNEL_TYPE_ERR;
+      pVdaa[k]->channelType = UNKNOWN;
+      DEBUG_PRINT(pVdaa[k], "%sVDAA not supported on this device\n",LOGPRINT_PREFIX);
+      continue;
+    }
+    else
+    {
+      pVdaa[k]->channelType = DAA;
+    }
+
+    if (pVdaa[k]->channelEnable)
+    {
+      /*Try to write innocuous register to test SPI is working*/
+      pVdaa[k]->WriteRegX(pVdaa[k]->pVdaaHWX,pVdaa[k]->channel,PCMRX_CNT_LO,0x5A);
+      data = pVdaa[k]->ReadRegX(pVdaa[k]->pVdaaHWX,pVdaa[k]->channel,PCMRX_CNT_LO);
+      if (data != 0x5A)
+      {
+        pVdaa[k]->error = RC_SPI_FAIL;
+        pVdaa[k]->channelEnable = FALSE;
+        DEBUG_PRINT(pVdaa[k], "%sVDAA %d not communicating\n",LOGPRINT_PREFIX,
+                    pVdaa[k]->channel);
+      }
+      else
+      {
+        num_devices++;
+      }
+    }
+  }
+
+  if(num_devices == 0)
+  {
+    DEBUG_PRINT(*pVdaa, "%sNo DAA devices detected\n", LOGPRINT_PREFIX);
+    return RC_SPI_FAIL;
+  }
+
+  for (k=0; k<size; k++)
+  {
+    if(pVdaa[k]->channelType != DAA)
+    {
+      continue;  /* Skip PROSLIC or UNDEFINED ports */
+    }
+    if (pVdaa[k]->channelEnable)
+    {
+
+      /* Apply General Configuration parameters */
+
+      /* No need to read-modify-write here since registers are in their reset state */
+      data = (Vdaa_General_Configuration.pwmm << 4) |
+             (Vdaa_General_Configuration.pwmEnable << 3);
+      pVdaa[k]->WriteRegX(pVdaa[k]->pVdaaHWX,pVdaa[k]->channel,CTRL1, data);
+
+      data = (Vdaa_General_Configuration.inte << 7) | (Vdaa_General_Configuration.intp
+             << 6) | 0x03;
+      pVdaa[k]->WriteRegX(pVdaa[k]->pVdaaHWX,pVdaa[k]->channel,CTRL2, data);
+
+      data = (Vdaa_General_Configuration.hssm << 3);
+      pVdaa[k]->WriteRegX(pVdaa[k]->pVdaaHWX,pVdaa[k]->channel,SMPL_CTRL, data);
+
+      data = (Vdaa_General_Configuration.iire << 4);
+      pVdaa[k]->WriteRegX(pVdaa[k]->pVdaaHWX,pVdaa[k]->channel,INTL_CTRL1, data);
+
+      data = (Vdaa_General_Configuration.rcald << 4);
+      pVdaa[k]->WriteRegX(pVdaa[k]->pVdaaHWX,pVdaa[k]->channel,RES_CALIB, data);
+
+      data = (Vdaa_General_Configuration.full2 << 4);
+      pVdaa[k]->WriteRegX(pVdaa[k]->pVdaaHWX,pVdaa[k]->channel,AC_TERM_CTRL, data);
+
+      data = (Vdaa_General_Configuration.lvfd) | (Vdaa_General_Configuration.filt <<
+             1) |
+             (Vdaa_General_Configuration.foh << 5) | (Vdaa_General_Configuration.full << 7);
+      pVdaa[k]->WriteRegX(pVdaa[k]->pVdaaHWX,pVdaa[k]->channel,DAA_CTRL5, data);
+
+      data = (Vdaa_General_Configuration.spim << 6);
+      pVdaa[k]->WriteRegX(pVdaa[k]->pVdaaHWX,pVdaa[k]->channel,PCM_SPI_CTRL, data);
+
+      data = (Vdaa_General_Configuration.cvp) | (Vdaa_General_Configuration.cvs << 2);
+      pVdaa[k]->WriteRegX(pVdaa[k]->pVdaaHWX,pVdaa[k]->channel,LN_VI_THRESH_INTE_CTRL,
+                          data);
+
+      data = (Vdaa_General_Configuration.gce << 1) | (Vdaa_General_Configuration.rg1
+             << 2);
+      pVdaa[k]->WriteRegX(pVdaa[k]->pVdaaHWX,pVdaa[k]->channel,SPRK_QNCH_CTRL, data);
+
+      /* Enable Lineside Device */
+      Vdaa_PowerupLineside(pVdaa[k]);
+    }
+  }
+  DEBUG_PRINT(*pVdaa,"%sDAA initialization completed\n",LOGPRINT_PREFIX);
+  return RC_NONE;
+}
+
+/*
+** Function:  Vdaa_ReadLinefeedStatus
+**
+** Description:
+** Read Status of Line Feed
+**
+** Returns:
+** RC_VDAA_ILOOP_OVLD if LCS >= 0x1F
+**      - no overload
+**
+*/
+
+int Vdaa_ReadLinefeedStatus (vdaaChanType *pVdaa,int8 *vloop, int16 *iloop)
+{
+  int16 regTemp = 0x1F;
+  uInt8 iloop_reg; /* REG 12[4:0] = Loop current*/
+
+  TRACEPRINT( pVdaa, "\n", NULL);
+  if(pVdaa->channelType != DAA)
+  {
+    return RC_IGNORE;
+  }
+  regTemp &= ReadReg(pVdaaHW,pVdaa->channel,LSIDE_STAT);
+  iloop_reg = (uInt8)regTemp;
+  *iloop = (regTemp*LCS_SCALE_NUM) /
+           LCS_SCALE_DEN; /* Multiply the read result by 3.3mA/bit*/
+
+  *vloop = (int8) ReadReg(pVdaaHW,pVdaa->channel,LINE_VOLT_STAT);
+  if(*vloop & 0x80)
+  {
+    *vloop = ~(*vloop - 1)*(-1);
+  }
+
+  if (iloop_reg == 0x1F)
+  {
+    return RC_VDAA_ILOOP_OVLD;
+  }
+  return RC_NONE;
+}
+
+/*
+** Function:  Vdaa_GetInterrupts
+**
+** Description:
+** Get Interrupts
+**
+** Returns:
+** number of interrupts
+**
+*/
+
+int Vdaa_GetInterrupts (vdaaChanType *pVdaa,vdaaIntType *pIntData)
+{
+  uInt8 data = 0;
+  int j;
+  TRACEPRINT( pVdaa, "\n", NULL);
+  pIntData->number = 0;
+
+  if(pVdaa->channelType != DAA)
+  {
+    return RC_IGNORE;
+  }
+
+  data = ReadReg(pVdaaHW,pVdaa->channel,INTE_SRC);      /*Snapshot Interrupts*/
+  WriteReg(pVdaaHW,pVdaa->channel,INTE_SRC,~(data));      /*Clear interrupts*/
+
+  for (j=0; j<8; j++)
+  {
+    if (data &(1<<j))
+    {
+
+      pIntData->irqs[pIntData->number] =   j;
+      pIntData->number++;
+
+    }
+  }
+  data = ReadReg(pVdaaHW,pVdaa->channel,LN_VI_THRESH_INTE_CTRL);
+
+  if (data &(0x08))                   /*to determine if CVI Interrupt is set*/
+  {
+    pIntData->irqs[pIntData->number] =   CVI;
+    pIntData->number++;
+    data &= ~(0x08);
+    WriteReg(pVdaaHW,pVdaa->channel,LN_VI_THRESH_INTE_CTRL,data);
+
+  }
+
+  return pIntData->number;
+}
+
+/*
+** Function:  Vdaa_ClearInterrupts
+**
+** Description:
+** Clear Interrupts
+**
+** Returns:
+**
+**
+*/
+
+int Vdaa_ClearInterrupts (vdaaChanType *pVdaa)
+{
+  uInt8 data = 0;
+
+  TRACEPRINT( pVdaa, "\n", NULL);
+  if(pVdaa->channelType != DAA)
+  {
+    return RC_IGNORE;
+  }
+
+  WriteReg(pVdaaHW,pVdaa->channel,INTE_SRC,
+           0x00);    /* Clear interrupts in REG 4 by writing 0's*/
+
+  /*Clear CVI interrupt by writing 0 at REG 44[3]*/
+  data = ReadReg(pVdaaHW,pVdaa->channel,LN_VI_THRESH_INTE_CTRL);
+  WriteReg(pVdaaHW,pVdaa->channel,LN_VI_THRESH_INTE_CTRL,data&0xF7);
+
+  return RC_NONE;
+}
+
+/*
+** Function:  Vdaa_GetHookStatus
+**
+** Description:
+** Read VDAA Hook Status
+**
+** Return Values -
+**      VDAA_ONHOOK
+**      VDAA_OFFHOOK
+**      VDAA_ONHOOK_MONITOR
+**      RC_INVALID_HOOK_STATUS
+*/
+
+uInt8 Vdaa_GetHookStatus (vdaaChanType *pVdaa)
+{
+  uInt8 data;
+
+  TRACEPRINT( pVdaa, "\n", NULL);
+  if(pVdaa->channelType != DAA)
+  {
+    return RC_IGNORE;
+  }
+
+  data = ReadReg(pVdaaHW,pVdaa->channel,DAA_CTRL1);
+  data &= 0x09;  /* Look at only ONHM and OH */
+
+  if((data & 0x80)&&(data & 0x01))
+  {
+    return VDAA_ONHOOK_MONITOR;
+  }
+  else if (data & 0x01)
+  {
+    return VDAA_OFFHOOK;
+  }
+  else
+  {
+    return VDAA_ONHOOK;
+  }
+}
+
+/*
+** Function:  Vdaa_SetHookStatus
+**
+** Description:
+** Set VDAA Hook switch to ONHOOK, OFFHOOK,
+** or ONHOOK_MONITOR
+**
+*/
+
+int Vdaa_SetHookStatus (vdaaChanType *pVdaa,uInt8 newHookStatus)
+{
+  uInt8 data= 0 ;
+
+  TRACEPRINT( pVdaa, "hookstate = %u\n", (unsigned int) newHookStatus);
+
+  if(pVdaa->channelType != DAA)
+  {
+    return RC_IGNORE;
+  }
+
+  switch (newHookStatus)
+  {
+    case VDAA_DIG_LOOPBACK:
+      /*Setting REG6[4]=1,REG5[0]=0,REG5[3]=0*/
+      data = ReadReg(pVdaaHW,pVdaa->channel,DAA_CTRL2);
+      data |= 0x10;
+      WriteReg(pVdaaHW,pVdaa->channel,DAA_CTRL2,data);
+      data = ReadReg(pVdaaHW,pVdaa->channel,DAA_CTRL1);
+      data &= ~(0x09);
+      WriteReg(pVdaaHW,pVdaa->channel,DAA_CTRL1,data);
+      break;
+
+    case VDAA_ONHOOK:
+      /*Setting REG6[4]=0,REG5[0]=0,REG5[3]=0*/
+      data = ReadReg(pVdaaHW,pVdaa->channel,DAA_CTRL1);
+      data &= 0xF6;
+      WriteReg(pVdaaHW,pVdaa->channel,DAA_CTRL1,data);
+      data = ReadReg(pVdaaHW,pVdaa->channel,DAA_CTRL2);
+      data &= 0xEF;
+      WriteReg(pVdaaHW,pVdaa->channel,DAA_CTRL2,data);
+      break;
+
+    case VDAA_OFFHOOK:
+      /*Setting REG6[4]=0,REG5[0]=1,REG5[3]=0*/
+      data = ReadReg(pVdaaHW,pVdaa->channel,DAA_CTRL1);
+      data &= 0xF7;
+      data |= 0x01;
+      WriteReg(pVdaaHW,pVdaa->channel,DAA_CTRL1,data);
+      data = ReadReg(pVdaaHW,pVdaa->channel,DAA_CTRL2);
+      data &= 0xEF;
+      WriteReg(pVdaaHW,pVdaa->channel,DAA_CTRL2,data);
+      break;
+
+    case VDAA_ONHOOK_MONITOR:
+      /*Setting REG6[4]=0,REG5[0]=0,REG5[3]=1*/
+      data = ReadReg(pVdaaHW,pVdaa->channel,DAA_CTRL1);
+      data &= 0xFE;
+      data |= 0x08;
+      WriteReg(pVdaaHW,pVdaa->channel,DAA_CTRL1,data);
+      data = ReadReg(pVdaaHW,pVdaa->channel,DAA_CTRL2);
+      data &= 0xEF;
+      WriteReg(pVdaaHW,pVdaa->channel,DAA_CTRL2,data);
+      break;
+
+    default:
+      return RC_UNSUPPORTED_OPTION;
+  }
+
+  return RC_NONE;
+}
+
+/*
+** Function:  Vdaa_SetLoopbackMode
+**
+** Description:
+** Loopback mode control
+**
+*/
+
+int Vdaa_SetLoopbackMode(vdaaChanType_ptr pVdaa, tLpbkMode lpbk_mode,
+                         tLpbkStatus lpbk_status)
+{
+  uInt8 regData;
+
+  TRACEPRINT(pVdaa, "lpbk_mode = %u lpbk_status = %d\n", (unsigned int) lpbk_mode,
+             (unsigned int) lpbk_status);
+  if(pVdaa->channelType != DAA)
+  {
+    return RC_IGNORE;
+  }
+
+  switch(lpbk_mode)
+  {
+    case LPBK_NONE:
+      /* Disable all loopback types, regardless of lpbk_status */
+      regData = ReadReg(pVdaaHW,pVdaa->channel,CTRL1);
+      if(regData & 0x02)
+      {
+        WriteReg(pVdaaHW,pVdaa->channel,CTRL1, regData & ~(0x02));
+      }
+
+      regData = ReadReg(pVdaaHW,pVdaa->channel,DAA_CTRL3);
+      if(regData & 0x01)
+      {
+        WriteReg(pVdaaHW,pVdaa->channel,DAA_CTRL3,0);
+      }
+
+      regData = ReadReg(pVdaaHW,pVdaa->channel,PCM_SPI_CTRL);
+      if(regData & 0x80)
+      {
+        WriteReg(pVdaaHW,pVdaa->channel,PCM_SPI_CTRL, regData & ~(0x80));
+      }
+      break;
+
+    case LPBK_IDL:
+      if(lpbk_status)
+      {
+        regData = ReadReg(pVdaaHW,pVdaa->channel,CTRL1);
+        WriteReg(pVdaaHW,pVdaa->channel,CTRL1, regData | 0x02);
+      }
+      else
+      {
+        regData = ReadReg(pVdaaHW,pVdaa->channel,CTRL1);
+        WriteReg(pVdaaHW,pVdaa->channel,CTRL1, regData & ~(0x02));
+      }
+      break;
+
+    case LPBK_DDL:
+      if(lpbk_status)
+      {
+        WriteReg(pVdaaHW,pVdaa->channel,DAA_CTRL3, 0x01);
+      }
+      else
+      {
+        WriteReg(pVdaaHW,pVdaa->channel,DAA_CTRL3, 0);
+      }
+      break;
+
+    case LPBK_PCML:
+      if(lpbk_status)
+      {
+        regData = ReadReg(pVdaaHW,pVdaa->channel,PCM_SPI_CTRL);
+        WriteReg(pVdaaHW,pVdaa->channel,PCM_SPI_CTRL, regData | 0x80);
+      }
+      else
+      {
+        regData = ReadReg(pVdaaHW,pVdaa->channel,PCM_SPI_CTRL);
+        WriteReg(pVdaaHW,pVdaa->channel,PCM_SPI_CTRL, regData & ~(0x80));
+      }
+      break;
+
+    default:
+      return RC_UNSUPPORTED_OPTION;
+  }
+
+  return RC_NONE;
+}
+
+/*
+** Function:  Vdaa_ADCCal
+**
+** Description:
+** This function calibrates the VDAA ADC manually
+**
+*/
+
+int Vdaa_ADCCal (vdaaChanType_ptr pVdaa, int32 size)
+{
+  uInt8 regTemp = 0;
+  int32 i;
+
+  TRACEPRINT(pVdaa, "size = %d\n", (int) size);
+  if(pVdaa->channelType != DAA)
+  {
+    return RC_IGNORE;
+  }
+
+  for(i = 0; i < size; i++)
+  {
+    /* Clear the previous ADC Calibration data by toggling CALZ*/
+    regTemp = ReadReg(pVdaaHW,pVdaa->channel,INTL_CTRL2);
+    regTemp |= 0x80;
+    WriteReg(pVdaaHW,pVdaa->channel,INTL_CTRL2,regTemp);
+    regTemp &= ~0x80;
+    WriteReg(pVdaaHW,pVdaa->channel,INTL_CTRL2,regTemp);
+
+    regTemp = ReadReg(pVdaaHW,pVdaa->channel,INTL_CTRL2); /*disable auto cal*/
+    regTemp |= 0x20;
+    WriteReg(pVdaaHW,pVdaa->channel,INTL_CTRL2,regTemp);
+
+    regTemp |= 0x40;                  /*initiate manual cal*/
+    WriteReg(pVdaaHW,pVdaa->channel,INTL_CTRL2,regTemp);
+    regTemp &= ~0x40;
+    WriteReg(pVdaaHW,pVdaa->channel,INTL_CTRL2,regTemp);
+    pVdaa++;
+  }
+  return RC_NONE;
+}
+
+/*
+** Function:  Vdaa_EnableWatchdog
+**
+** Description:
+** Enables watchdog timer
+**
+*/
+
+int Vdaa_EnableWatchdog(vdaaChanType_ptr pVdaa)
+{
+  uInt8 regTemp;
+
+  TRACEPRINT(pVdaa, "\n", NULL);
+  if(pVdaa->channelType != DAA)
+  {
+    return RC_IGNORE;
+  }
+
+  regTemp = ReadReg(pVdaaHW,pVdaa->channel,CTRL2);
+  WriteReg(pVdaaHW,pVdaa->channel,CTRL2,regTemp | 0x10);
+
+  return RC_NONE;
+}
+
+/*
+** Function:  Vdaa_SetHybridEnable
+**
+** Description:
+** Enables watchdog timer
+**
+*/
+
+int Vdaa_SetHybridEnable(vdaaChanType_ptr pVdaa, int enable)
+{
+  uInt8 regTemp;
+  TRACEPRINT(pVdaa, "enable = %d\n", enable);
+
+  if(pVdaa->channelType != DAA)
+  {
+    return RC_IGNORE;
+  }
+
+  regTemp = ReadReg(pVdaaHW,pVdaa->channel,CTRL2);
+  if(enable)
+  {
+    WriteReg(pVdaaHW,pVdaa->channel,CTRL2,regTemp | 0x02);
+  }
+  else
+  {
+    WriteReg(pVdaaHW,pVdaa->channel,CTRL2,regTemp & ~(0x02));
+  }
+
+  return RC_NONE;
+}
+
+
+/*
+** Function:  Vdaa_SoftReset
+**
+** Description:
+** Execute soft reset
+**
+*/
+
+int Vdaa_SoftReset(vdaaChanType_ptr pVdaa)
+{
+  TRACEPRINT(pVdaa, "\n", NULL);
+  if(pVdaa->channelType != DAA)
+  {
+    return RC_IGNORE;
+  }
+
+  WriteReg(pVdaaHW,pVdaa->channel,CTRL1,0x80);
+  return RC_NONE;
+}
+
+/*
+** Function:  Vdaa_ReadFDTStatus
+**
+** Description:
+** Read FDT bit
+**
+** Returns:
+** 0 - Frame Not Detected
+** 1 - Frame Detected
+**
+*/
+
+int Vdaa_ReadFDTStatus(vdaaChanType_ptr pVdaa)
+{
+  TRACEPRINT(pVdaa, "\n", NULL);
+  return (ReadReg(pVdaaHW,pVdaa->channel,LSIDE_REV) & 0x40);
+}
+
+/*
+** Function:  Vdaa_PowerupLineside
+**
+** Description:
+** Power up lineside device
+**
+*/
+
+int Vdaa_PowerupLineside(vdaaChanType_ptr pVdaa)
+{
+  uInt8 data; 
+
+  TRACEPRINT(pVdaa, "\n", NULL);
+  if(pVdaa->channelType != DAA)
+  {
+    return RC_IGNORE;
+  }
+
+  WriteReg(pVdaaHW,pVdaa->channel,DAA_CTRL2,0); /* Powerup lineside device */
+  /* We do a double read to give the front end time to power up and sync up with the system side.. */
+  data = ReadReg(pVdaaHW,pVdaa->channel,LSIDE_REV);
+  data = 0;
+  data = ReadReg(pVdaaHW,pVdaa->channel,LSIDE_REV);
+  pVdaa->deviceId->lsRev= ((data&0x3C)>>2);
+  data = pVdaa->ReadRegX(pVdaa->pVdaaHWX,pVdaa->channel,SYS_LINE_DEV_REV);
+  pVdaa->deviceId->lsType= ((data&~(0xF))>>4);
+
+  return RC_NONE;
+}
+
+/*
+** Function:  Vdaa_PowerdownLineside
+**
+** Description:
+** Power down lineside device
+**
+*/
+
+int Vdaa_PowerdownLineside(vdaaChanType_ptr pVdaa)
+{
+  TRACEPRINT(pVdaa, "\n", NULL);
+  if(pVdaa->channelType != DAA)
+  {
+    return RC_IGNORE;
+  }
+
+  WriteReg(pVdaaHW,pVdaa->channel,DAA_CTRL2,0x10);
+  return RC_NONE;
+}
+
+/*
+** Function: Vdaa_PrintDebugData
+**
+** Description:
+** Dump of VDAA register space
+**
+** Input Parameters:
+** pVdaa:       pointer to SiVoiceChanType or vdaaChanType
+**
+*/
+
+int Vdaa_PrintDebugData (vdaaChanType *pVdaa)
+{
+#ifdef ENABLE_DEBUG
+  int i;
+  for (i=0; i<60; i++)
+  {
+    LOGPRINT ("%sRegister %d = %X\n",LOGPRINT_PREFIX,i,ReadReg(pVdaaHW,
+              pVdaa->channel,i));
+  }
+#endif
+  return RC_NONE;
+}
+
+/*
+** Function: Vdaa_InitLineInUseCheck
+**
+** Description:
+** Set line in use test limits
+**
+** Input Parameters:
+** liuCfg:      pointer to vdaa_LIU_Config
+** minOnV:      minimum acceptable onhook voltage (below indicates parallel handset)
+** minOffV:     minimum acceptable offhook voltage (below indicates parallel handset)
+** minOffI:     minimum acceptable offhook loop current (below indicates parallel handset)
+**
+*/
+
+int Vdaa_InitLineInUseCheck(vdaa_LIU_Config *liuCfg, int8 minOnV, int8 minOffV,
+                            int16 minOffI)
+{
+  TRACEPRINT_NOCHAN("min0nV = %d minoffV = %d minOffI = %d\n", minOnV, minOffV,
+                    minOffI);
+  liuCfg->status = PAR_HANDSET_NOT_DETECTED;
+  liuCfg->min_onhook_vloop = minOnV;
+  liuCfg->min_offhook_vloop = minOffV;
+  liuCfg->min_offhook_iloop = minOffI;
+  return RC_NONE;
+}
+
+/*
+** Function: Vdaa_CheckForLineInUse
+**
+** Description:
+** Monitor LVCS to detect intrusion or parallel handset
+**
+** Input Parameters:
+** pVdaa:       pointer to SiVoiceChanType or vdaaChanType
+** liuCfg:      pointer to vdaa_LIU_Config
+**
+** Output Parameters:
+**
+** Return:
+** VDAA_ONHOOK    -   line is onhook
+** VDAA_OFFHOOK   -   line is offhook (in use)
+**
+*/
+
+uInt8 Vdaa_CheckForLineInUse(vdaaChanType *pVdaa, vdaa_LIU_Config *liuCfg)
+{
+  int8 vloop;
+  int16 iloop;
+
+  TRACEPRINT(pVdaa, "\n", NULL);
+  if(pVdaa->channelType != DAA)
+  {
+    return RC_IGNORE;
+  }
+
+  /* Check voltage and current */
+  Vdaa_ReadLinefeedStatus(pVdaa, &vloop,&iloop);
+  if(vloop < 0)
+  {
+    vloop *= -1;
+  }
+  liuCfg->measured_iloop = iloop;
+  liuCfg->measured_vloop = vloop;
+  liuCfg->status = PAR_HANDSET_NOT_DETECTED;
+
+  /* Read hookswitch status */
+  if(Vdaa_GetHookStatus(pVdaa) == VDAA_OFFHOOK)
+  {
+    if((vloop < liuCfg->min_offhook_vloop)||(iloop < liuCfg->min_offhook_iloop))
+    {
+      liuCfg->status = PAR_HANDSET_DETECTED;
+    }
+
+    return VDAA_OFFHOOK;
+  }
+  else
+  {
+    if(vloop < liuCfg->min_onhook_vloop)
+    {
+      liuCfg->status = PAR_HANDSET_DETECTED;
+    }
+
+    return VDAA_ONHOOK;
+  }
+}
+
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/src/vdaa_constants.c b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/src/vdaa_constants.c
new file mode 100644
index 0000000..9c4606b
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/src/vdaa_constants.c
@@ -0,0 +1,201 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Si3217x ProSLIC API Configuration Tool Version 4.2.1
+ * Last Updated in API Release: 9.2.0
+ * source XML file: si3217x_FLBK_GDRV_constants.xml
+ *
+ * Auto generated file from configuration tool.
+ */
+
+#include "../inc/vdaa.h"
+
+vdaa_General_Cfg Vdaa_General_Configuration  = {
+    INTE_DISABLED,
+    INTE_ACTIVE_LOW,
+    RES_CAL_ENABLED,
+    FS_8KHZ,
+    FOH_128,
+    LVS_FORCE_ENABLED,
+    CVS_CURRENT,
+    CVP_ABOVE,
+    GCE_DISABLED,
+    IIR_DISABLED,
+    FULL2_ENABLED,
+    FULL_DISABLED,
+    FILT_HPF_200HZ,
+    RG1_DISABLED,
+    PWM_DELTA_SIGMA,
+    PWM_DISABLED,
+    SPIM_TRI_CS
+};
+
+vdaa_Country_Cfg Vdaa_Country_Presets[] ={
+    {
+    RZ_MAX,
+    DC_50,
+    AC_600,
+    DCV3_5,
+    MINI_10MA,
+    ILIM_DISABLED,
+    OHS_LESS_THAN_0_5MS,
+    HYBRID_ENABLED
+    },  /* COU_USA */
+    {
+    RZ_MAX,
+    DC_50,
+    AC_270__750_150,
+    DCV3_5,
+    MINI_10MA,
+    ILIM_ENABLED,
+    OHS_3MS,
+    HYBRID_ENABLED
+    },  /* COU_GERMANY */
+    {
+    RZ_MAX,
+    DC_50,
+    AC_200__680_100,
+    DCV3_5,
+    MINI_10MA,
+    ILIM_DISABLED,
+    OHS_LESS_THAN_0_5MS,
+    HYBRID_ENABLED
+    },  /* COU_CHINA */
+    {
+    RZ_MAX,
+    DC_50,
+    AC_220__820_120,
+    DCV3_2,
+    MINI_12MA,
+    ILIM_DISABLED,
+    OHS_26MS,
+    HYBRID_ENABLED
+    }   /* COU_AUSTRALIA */
+};
+
+vdaa_audioGain_Cfg Vdaa_audioGain_Presets[] ={
+    {
+    0,    /* mute */
+    XGA_GAIN,    /* xXGA2 */
+    0,    /* xXG2 */
+    XGA_GAIN,    /* xXGA3 */
+    0,    /* xXG3 */
+    64,    /* AxM */
+    0     /* cpEn */
+    },  /* AUDIO_GAIN_0DB */
+    {
+    0,    /* mute */
+    XGA_ATTEN,    /* xXGA2 */
+    4,    /* xXG2 */
+    XGA_GAIN,    /* xXGA3 */
+    0,    /* xXG3 */
+    64,    /* AxM */
+    0     /* cpEn */
+    },  /* AUDIO_ATTEN_4DB */
+    {
+    0,    /* mute */
+    XGA_ATTEN,    /* xXGA2 */
+    6,    /* xXG2 */
+    XGA_GAIN,    /* xXGA3 */
+    0,    /* xXG3 */
+    64,    /* AxM */
+    0     /* cpEn */
+    },  /* AUDIO_ATTEN_6DB */
+    {
+    0,    /* mute */
+    XGA_ATTEN,    /* xXGA2 */
+    11,    /* xXG2 */
+    XGA_GAIN,    /* xXGA3 */
+    0,    /* xXG3 */
+    64,    /* AxM */
+    0     /* cpEn */
+    }   /* AUDIO_ATTEN_11DB */
+};
+
+vdaa_Ring_Detect_Cfg Vdaa_Ring_Detect_Presets[] ={
+    {
+    RDLY_512MS,
+    RT__13_5VRMS_16_5VRMS,
+    12,    /* RMX */
+    RTO_1408MS,
+    RCC_640MS,
+    RNGV_DISABLED,
+    17,    /* RAS */
+    RFWE_HALF_WAVE,
+    RDI_BEG_END_BURST, 
+    RGDT_ACTIVE_LOW 
+    },  /* RING_DET_NOVAL_LOWV */
+    {
+    RDLY_512MS,
+    RT__40_5VRMS_49_5VRMS,
+    12,    /* RMX */
+    RTO_1408MS,
+    RCC_640MS,
+    RNGV_ENABLED,
+    17,    /* RAS */
+    RFWE_RNGV_RING_ENV,
+    RDI_BEG_END_BURST, 
+    RGDT_ACTIVE_LOW 
+    }   /* RING_DET_VAL_HIGHV */
+};
+
+vdaa_PCM_Cfg Vdaa_PCM_Presets[] ={
+    {
+    U_LAW,
+    PCLK_1_PER_BIT,
+    TRI_POS_EDGE
+    },  /* DAA_PCM_8ULAW */
+    {
+    A_LAW,
+    PCLK_1_PER_BIT,
+    TRI_POS_EDGE
+    },  /* DAA_PCM_8ALAW */
+    {
+    LINEAR_16_BIT,
+    PCLK_1_PER_BIT,
+    TRI_POS_EDGE
+    }   /* DAA_PCM_16LIN */
+};
+
+vdaa_Hybrid_Cfg Vdaa_Hybrid_Presets[] ={
+    {
+       0,    /* HYB1 */
+     254,    /* HYB2 */
+       0,    /* HYB3 */
+       1,    /* HYB4 */
+     255,    /* HYB5 */
+       1,    /* HYB6 */
+       0,    /* HYB7 */
+       0    /* HYB8 */
+    },  /* HYB_600_0_0_500FT_24AWG */
+    {
+       4,    /* HYB1 */
+     246,    /* HYB2 */
+     242,    /* HYB3 */
+       4,    /* HYB4 */
+     254,    /* HYB5 */
+     255,    /* HYB6 */
+       1,    /* HYB7 */
+     255    /* HYB8 */
+    },  /* HYB_270_750_150_500FT_24AWG */
+    {
+       4,    /* HYB1 */
+     245,    /* HYB2 */
+     243,    /* HYB3 */
+       7,    /* HYB4 */
+     253,    /* HYB5 */
+       0,    /* HYB6 */
+       1,    /* HYB7 */
+     255    /* HYB8 */
+    },  /* HYB_200_680_100_500FT_24AWG */
+    {
+       4,    /* HYB1 */
+     244,    /* HYB2 */
+     241,    /* HYB3 */
+       6,    /* HYB4 */
+     253,    /* HYB5 */
+     255,    /* HYB6 */
+       2,    /* HYB7 */
+     255    /* HYB8 */
+    }   /* HYB_220_820_120_500FT_24AWG */
+};
+
diff --git a/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/timer.h b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/timer.h
new file mode 100644
index 0000000..02b8a01
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/sound/soc/codecs/si3218x/timer.h
@@ -0,0 +1,89 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * $Id: Timer.h 109 2008-10-22 19:45:09Z lajordan@SILABS.COM $
+ * 
+ * This file is system specific and should be edited for your hardware platform
+ *
+ * This file is used by proslic_timer_intf.h and proslic_spiGci.h
+ */
+#ifndef TIME_TYPE_H
+#define TIME_TYPE_H
+
+typedef long long _int64;
+
+/*
+** System timer interface structure 
+*/
+typedef struct{
+	_int64 ticksPerSecond;
+} systemTimer_S;
+
+/*
+** System time stamp
+*/
+typedef struct{
+	_int64 time;
+} timeStamp;
+
+/*
+** Function: SYSTEM_TimerInit
+**
+** Description: 
+** Initializes the timer used in the delay and time measurement functions
+** by doing a long inaccurate sleep and counting the ticks
+**
+** Input Parameters: 
+**
+** Return:
+** none
+*/
+void TimerInit (systemTimer_S *pTimerObj);
+/*
+** Function: DelayWrapper
+**
+** Description: 
+** Waits the specified number of ms
+**
+** Input Parameters: 
+** hTimer: timer pointer
+** timeInMs: time in ms to wait
+**
+** Return:
+** none
+*/
+int time_DelayWrapper (void *hTimer, int timeInMs);
+
+
+/*
+** Function: TimeElapsedWrapper
+**
+** Description: 
+** Calculates number of ms that have elapsed
+**
+** Input Parameters: 
+** hTImer: pointer to timer object
+** startTime: timer value when function last called
+** timeInMs: pointer to time elapsed
+**
+** Return:
+** timeInMs: time elapsed since start time
+*/
+int time_TimeElapsedWrapper (void *hTimer, void *startTime, int *timeInMs);
+
+int time_GetTimeWrapper (void *hTimer, void *time);
+#endif
+/*
+** $Log: Timer.h,v $
+** Revision 1.2  2007/02/21 16:55:18  lajordan
+** moved function prototypes here
+**
+** Revision 1.1  2007/02/16 23:55:07  lajordan
+** no message
+**
+** Revision 1.2  2007/02/15 23:33:25  lajordan
+** no message
+**
+** Revision 1.1.1.1  2006/07/13 20:26:08  lajordan
+** no message
+**
+*/
