Baseline update from LYNQ_SDK_ASR_T108_V05.03.01.00(kernel build error.)

Change-Id: I56fc72cd096e82c589920026553170e5cb9692eb
diff --git a/marvell/services/audio/libacm/acm/src/acm_alc5616.h b/marvell/services/audio/libacm/acm/src/acm_alc5616.h
old mode 100644
new mode 100755
index 65d9ad7..80420e4
--- a/marvell/services/audio/libacm/acm/src/acm_alc5616.h
+++ b/marvell/services/audio/libacm/acm/src/acm_alc5616.h
@@ -270,6 +270,8 @@
     "USTICA",
     "DELAY",
     "NAU8810",
+    "ES8311",
+    "TLV320AIC3X",
     "ALC5616"
 } ;
 #endif
diff --git a/marvell/services/audio/libacm/acm/src/acm_aph.c b/marvell/services/audio/libacm/acm/src/acm_aph.c
old mode 100644
new mode 100755
index a947a74..dfa6b5f
--- a/marvell/services/audio/libacm/acm/src/acm_aph.c
+++ b/marvell/services/audio/libacm/acm/src/acm_aph.c
@@ -63,6 +63,12 @@
 //NAU8810 is connected
 #include "acm_nau8810.h"
 static BOOL acm_codec_connected = TRUE;
+#elif defined(CODEC_ES8311)
+#include "acm_es8311.h"
+static BOOL acm_codec_connected = TRUE;
+#elif defined(CODEC_TLV320AIC3X)
+#include "acm_tlv320aic3x.h"
+static BOOL acm_codec_connected = TRUE;
 #elif defined(CODEC_ALC5616)
 //ALC5616 is connected
 #include "acm_alc5616.h"
@@ -215,7 +221,7 @@
     return NULL;
 }
 
-#if  !defined(CODEC_PM805) && !defined(CODEC_PM812) && !defined(CODEC_NAU8810) && !defined(CODEC_ALC5616)
+#if  !defined(CODEC_PM805) && !defined(CODEC_PM812) && !defined(CODEC_NAU8810) && !defined(CODEC_ALC5616)&&!defined(CODEC_TLV320AIC3X)&& !defined(CODEC_ES8311)
 static ACMAPH_VolumeComponent *_get_APHVolumeTable(APH_PATH_ID path_id, ACMAPH_VolumeComponent *pTable, unsigned char max) {
     int i = 0;
 
@@ -438,6 +444,11 @@
             else
                 RegisterList[i].Value = CODEC_NAU8810_VOICE_NB;
         }
+#elif defined(CODEC_ES8311)
+        /* es8311 customer codec always as slave and fix 256fs , we have config it in enable path */
+#elif defined(CODEC_TLV320AIC3X)
+ 
+
 #elif defined(CODEC_ALC5616)
         if( RegisterList[i].Address == CODEC_ALC5616_VOICE_REG70){
             LOGI(APHAudioPathEnable, "%s/L%d: modem PCM is %s", __FUNCTION__, __LINE__, modem_is_master?"master":"slave");
@@ -460,6 +471,12 @@
         component_handler->ACH_Handle(&param);
     }
 
+#if defined(CODEC_ES8311)
+    LOGE(APHAudioPathDisable, "%s wil enable audio pa\n", __FUNCTION__);
+
+    system("echo 1 > /sys/bus/i2c/devices/0-0018/opa_gpio_op");
+#endif
+
     return ACM_RC_OK;
 }
 
@@ -501,6 +518,12 @@
         ////path_status_table[path_id].value = 0;       // Save volume even after disabled
         path_status_table[path_id].mute = 0;
     }
+#if defined(CODEC_ES8311)
+
+    LOGE(APHAudioPathDisable, "%s will disable audio ap! \n", __FUNCTION__);
+    system("echo 0 > /sys/bus/i2c/devices/0-0018/opa_gpio_op");
+
+#endif
 
     size = pTable->RegisterNum;
     RegisterList = pTable->RegisterList;
@@ -830,7 +853,7 @@
     unsigned int i;
     unsigned char index_volume = 0;
 
-#if  defined(CODEC_PM805) || defined(CODEC_PM812) || defined(CODEC_NAU8810) || defined(CODEC_ALC5616)
+#if  defined(CODEC_PM805) || defined(CODEC_PM812) || defined(CODEC_NAU8810) || defined(CODEC_ALC5616) || defined(CODEC_TLV320AIC3X)|| defined(CODEC_ES8311)
     AC_IPC_Package  package;
     ACMCodec_GainT buffer;
     AUDIO_PROFILE_ID cur_Profile_id = HIFI_HANDSET;
@@ -859,7 +882,7 @@
         return ACM_RC_INVALID_PATH;
     }
 
-#if  defined(CODEC_PM805) || defined(CODEC_PM812) || defined(CODEC_NAU8810) || defined(CODEC_ALC5616)
+#if  defined(CODEC_PM805) || defined(CODEC_PM812) || defined(CODEC_NAU8810) || defined(CODEC_TLV320AIC3X)|| defined(CODEC_ALC5616) || defined(CODEC_ES8311)
     if ((APH_PATH_ID_HIFIRECORDFROMMIC1 == path_id) || (APH_PATH_ID_HIFIRECORDFROMHSMIC == path_id)
             || (APH_PATH_ID_VOICERECORDFROMMIC1 == path_id) ||(APH_PATH_ID_VOICERECORDFROMHSMIC == path_id))
     {
@@ -926,7 +949,7 @@
 
 #endif
 
-#if  !defined(CODEC_PM805) && !defined(CODEC_PM812) && !defined(CODEC_NAU8810) && !defined(CODEC_ALC5616)
+#if  !defined(CODEC_PM805) && !defined(CODEC_PM812) && !defined(CODEC_NAU8810) && !defined(CODEC_TLV320AIC3X) && !defined(CODEC_ALC5616)&& !defined(CODEC_ES8311)
     pTable = _get_APHVolumeTable(path_id, ACM_Volume, APH_PATH_OUT_CNT);
     if(pTable == NULL){
         LOGE(APHAudioPathVolumeSet, "%s/L%d: Error pTable=%d", __FUNCTION__, __LINE__, pTable);
@@ -960,7 +983,7 @@
         return ACM_RC_INVALID_VOLUME_CHANGE;
     }
 
-#if  defined(CODEC_PM805) || defined(CODEC_PM812) || defined(CODEC_NAU8810) || defined(CODEC_ALC5616)
+#if  defined(CODEC_PM805) || defined(CODEC_PM812) || defined(CODEC_NAU8810) || defined(CODEC_TLV320AIC3X) || defined(CODEC_ALC5616) || defined(CODEC_ES8311)
 
     if (0xFFFF != buffer.Rx_CodecGain[index_volume].RegAddr_1)
     {
@@ -1111,7 +1134,7 @@
 
 ACM_ReturnCode APHGetMSAGain(const char *out_path, const char *path, unsigned char *volume, unsigned short id, signed short *gain, signed short *sidetone_gain) {
 
-#if  defined(CODEC_PM805) || defined(CODEC_PM812) || defined(CODEC_NAU8810) || defined(CODEC_ALC5616)
+#if  defined(CODEC_PM805) || defined(CODEC_PM812) || defined(CODEC_NAU8810)|| defined(CODEC_TLV320AIC3X) || defined(CODEC_ALC5616) || defined(CODEC_ES8311)
     int path_id = INVALID_PATH_ID;
     AC_IPC_Package  package;
     ACMCodec_GainT buffer;
@@ -1202,6 +1225,31 @@
 
 }
 
+
+#ifdef MBTK_AUDIO_GAIN_SAVE_SUPPORT
+ACM_ReturnCode MBTK_ACMSaveMSAGain(unsigned char *gain, int gain_num) {
+#if defined(CODEC_ES8311)
+    AC_IPC_Package  package;
+
+    memset(&package, 0x00, sizeof(AC_IPC_Package));
+
+    LOGI(APHGetMSAGain, "%s/L%d start.", __FUNCTION__, __LINE__);
+
+    package.type = AUDIO_NVM_SaveCalibrationData;
+    memcpy(&(package.body), gain, gain_num);
+    package.ptr = NULL;
+
+    NVM_Calibration_IPC(&package);
+
+    return ACM_RC_OK;
+
+#else
+    LOGI(APHGetMSAGain,"Not supported codec! APHSaveMSAGain!");
+    return ACM_RC_OK;
+#endif
+}
+#endif
+
 #ifdef PXA1826_AUDIO
 ACM_ReturnCode APHSetMSAGain(AC_Digital_Gain *gain) {
     VolumeCtlMsg volume_cmd;
diff --git a/marvell/services/audio/libacm/acm/src/acm_es8311.h b/marvell/services/audio/libacm/acm/src/acm_es8311.h
new file mode 100755
index 0000000..22c0ece
--- /dev/null
+++ b/marvell/services/audio/libacm/acm/src/acm_es8311.h
@@ -0,0 +1,123 @@
+/*
+ * ASR Audio path definition of ES8311 
+ *
+ * Copyright (C) 2018 ASR Microelectronic Ltd.
+ *
+ * Author: Chen wen<wenchen@asrmicro.com>
+ *
+ * This file contains proprietary information.
+ * No dissemination allowed without prior written permission from
+ * ASR Microelectronic Ltd.
+ *
+ * File Description:
+ *
+ * This file contains header for audio path definition of ES8311 
+ */
+
+#ifndef ACM_ES8311_H
+#define ACM_ES8311_H
+
+
+
+/* ES8311 alway as slave , and fix fs = 256 */
+
+/////////////////////////APH_PATH_ID_HIFIPLAYTOEARPHONE//////////////////////////
+ACMAPH_Register ACM_ES8311_Disable[]={
+    {ES8311, 0x0e, 0xff}, {ES8311, 0x12, 0x02}, 
+    {ES8311, 0x14, 0x00}, {ES8311, 0x0d, 0xf9}, 
+    {ES8311, 0x15, 0x00}, {ES8311, 0x0d, 0xf9},
+    {ES8311, 0x37, 0x08}, {ES8311, 0x02, 0x10},
+    {ES8311, 0x00, 0x00}, {ES8311, 0x00, 0x1f},
+    {ES8311, 0x01, 0x30}, {ES8311, 0x01, 0x00},
+    {ES8311, 0x45, 0x00}, 
+};
+	
+ACMAPH_Register ACM_ES8311_Enable[]={
+	/* 0x17 and 0x32 need customer re-define */
+    {ES8311, 0x00 ,0x80}, {ES8311, 0x01 ,0x7f},
+	{ES8311, 0x02 ,0x00}, {ES8311, 0x03 ,0x10},
+	{ES8311, 0x04 ,0x20}, {ES8311, 0x05 ,0x00},
+	{ES8311, 0x06 ,0x43}, {ES8311, 0x07 ,0x00},
+	{ES8311, 0x08 ,0xff}, {ES8311, 0x09 ,0x0f},
+	{ES8311, 0x0a ,0x0f}, {ES8311, 0x0b ,0x00},
+	{ES8311, 0x0c ,0x00}, {ES8311, 0x0d ,0x01},
+	{ES8311, 0x0e ,0x00}, {ES8311, 0x0f ,0x00},
+	{ES8311, 0x10 ,0x03}, {ES8311, 0x11 ,0x9f},
+	{ES8311, 0x12 ,0x00}, {ES8311, 0x13 ,0x10},
+	{ES8311, 0x14 ,0x1a}, {ES8311, 0x15 ,0x40},
+	{ES8311, 0x16 ,0x34}, /* {ES8311, 0x17 ,0x8f}, */
+	{ES8311, 0x18 ,0x00}, {ES8311, 0x19 ,0x00},
+	{ES8311, 0x1a ,0x00}, {ES8311, 0x1b ,0x0a},
+	{ES8311, 0x1c ,0x6a}, {ES8311, 0x1e ,0x00},
+	{ES8311, 0x32 ,0x9f}, /* {ES8311, 0x37 ,0x08}, */
+	{ES8311, 0x44 ,0x00}, {ES8311, 0x45 ,0x00},
+};
+
+
+ACMAPH_Register ACM_ES8311_Mic_Mute[] = {
+    {ES8311, 0x0a, 0x40},/* customer do not change adc gain */
+};
+	
+ACMAPH_Register ACM_ES8311_Mic_UnMute[] = {
+    {ES8311, 0x0a, 0x00},/* customer do not change adc gain */
+};
+
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+static ACMAPH_Component ACM_Disable[APH_PATH_ID_CNT]={
+    {APH_PATH_ID_HIFIPLAYTOEARPHONE,    ACM_ES8311_Disable,     sizeof(ACM_ES8311_Disable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_HIFIPLAYTOSPKR,        ACM_ES8311_Disable,     sizeof(ACM_ES8311_Disable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_HIFIPLAYTOHP,          ACM_ES8311_Disable,     sizeof(ACM_ES8311_Disable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_HIFIRECORDFROMMIC1,    ACM_ES8311_Disable,     sizeof(ACM_ES8311_Disable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_HIFIRECORDFROMHSMIC,   ACM_ES8311_Disable,     sizeof(ACM_ES8311_Disable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_VOICEPLAYTOEARPHONE,   ACM_ES8311_Disable,     sizeof(ACM_ES8311_Disable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_VOICEPLAYTOSPKR,       ACM_ES8311_Disable,     sizeof(ACM_ES8311_Disable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_VOICEPLAYTOHP,         ACM_ES8311_Disable,     sizeof(ACM_ES8311_Disable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_VOICERECORDFROMMIC1,   ACM_ES8311_Disable,     sizeof(ACM_ES8311_Disable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_VOICERECORDFROMHSMIC,  ACM_ES8311_Disable,     sizeof(ACM_ES8311_Disable)/sizeof(ACMAPH_Register)},
+};
+
+static ACMAPH_Component ACM_Enable[APH_PATH_ID_CNT]={
+    {APH_PATH_ID_HIFIPLAYTOEARPHONE,    ACM_ES8311_Enable,      sizeof(ACM_ES8311_Enable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_HIFIPLAYTOSPKR,        ACM_ES8311_Enable,      sizeof(ACM_ES8311_Enable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_HIFIPLAYTOHP,          ACM_ES8311_Enable,      sizeof(ACM_ES8311_Enable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_HIFIRECORDFROMMIC1,    ACM_ES8311_Enable,      sizeof(ACM_ES8311_Enable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_HIFIRECORDFROMHSMIC,   ACM_ES8311_Enable,      sizeof(ACM_ES8311_Enable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_VOICEPLAYTOEARPHONE,   ACM_ES8311_Enable,      sizeof(ACM_ES8311_Enable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_VOICEPLAYTOSPKR,       ACM_ES8311_Enable,      sizeof(ACM_ES8311_Enable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_VOICEPLAYTOHP,         ACM_ES8311_Enable,      sizeof(ACM_ES8311_Enable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_VOICERECORDFROMMIC1,   ACM_ES8311_Enable,      sizeof(ACM_ES8311_Enable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_VOICERECORDFROMHSMIC,  ACM_ES8311_Enable,      sizeof(ACM_ES8311_Enable)/sizeof(ACMAPH_Register)},
+};
+
+static ACMAPH_Component ACM_Mute[APH_PATH_IN_CNT]={
+    {APH_PATH_ID_HIFIRECORDFROMMIC1,    ACM_ES8311_Mic_Mute,    sizeof(ACM_ES8311_Mic_Mute)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_HIFIRECORDFROMHSMIC,   ACM_ES8311_Mic_Mute,    sizeof(ACM_ES8311_Mic_Mute)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_VOICERECORDFROMMIC1,   ACM_ES8311_Mic_Mute,    sizeof(ACM_ES8311_Mic_Mute)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_VOICERECORDFROMHSMIC,  ACM_ES8311_Mic_Mute,    sizeof(ACM_ES8311_Mic_Mute)/sizeof(ACMAPH_Register)},
+};
+static ACMAPH_Component ACM_UnMute[APH_PATH_IN_CNT]={
+    {APH_PATH_ID_HIFIRECORDFROMMIC1,    ACM_ES8311_Mic_UnMute,  sizeof(ACM_ES8311_Mic_UnMute)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_HIFIRECORDFROMHSMIC,   ACM_ES8311_Mic_UnMute,  sizeof(ACM_ES8311_Mic_UnMute)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_VOICERECORDFROMMIC1,   ACM_ES8311_Mic_UnMute,  sizeof(ACM_ES8311_Mic_UnMute)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_VOICERECORDFROMHSMIC,  ACM_ES8311_Mic_UnMute,  sizeof(ACM_ES8311_Mic_UnMute)/sizeof(ACMAPH_Register)},
+};
+
+extern ACH_ComponentHandler es8311_handler;
+
+static APH_ACHComponent ACH_component_table[] = {
+    {ES8311, &es8311_handler},
+};
+//Sorted as APH_AudioComponent
+static char APH_AudioComponent_Name[][16]= {
+    "ELBA",
+    "USTICA",
+    "DELAY",
+    "NAU8810",
+     "ES8311",
+    "TLV320AIC3X",
+    "ALC5616"
+   
+} ;
+#endif
+
diff --git a/marvell/services/audio/libacm/acm/src/acm_es8311_handle.c b/marvell/services/audio/libacm/acm/src/acm_es8311_handle.c
new file mode 100755
index 0000000..0013836
--- /dev/null
+++ b/marvell/services/audio/libacm/acm/src/acm_es8311_handle.c
@@ -0,0 +1,199 @@
+/*
+ * All Rights Reserved
+ *
+ * MARVELL CONFIDENTIAL
+ * Copyright 2012 Marvell International Ltd All Rights Reserved.
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Marvell International Ltd or its
+ * suppliers or licensors. Title to the Material remains with Marvell International Ltd
+ * or its suppliers and licensors. The Material contains trade secrets and
+ * proprietary and confidential information of Marvell or its suppliers and
+ * licensors. The Material is protected by worldwide copyright and trade secret
+ * laws and treaty provisions. No part of the Material may be used, copied,
+ * reproduced, modified, published, uploaded, posted, transmitted, distributed,
+ * or disclosed in any way without Marvell's prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Marvell in writing.
+ *
+ */
+
+#define LOG_TAG "acm_ach_es8311"
+#define LOG_NDEBUG 0
+
+#include <cutils/log.h>
+#include "acm_es8311_handle.h"
+
+
+#define NUM_OF_REGS			 0xff
+#define ES8311_ID_REG        0xFD  /* chip id : 0x83 */
+
+
+static void es8311_enable(void);
+static void es8311_disable(void);
+static void es8311_reset(void);
+static void es8311_get_type_and_id(int *type, unsigned char *id);
+static ACH_ReturnCode es8311_handle(void *setting);
+
+ACH_ComponentHandler es8311_handler = {
+    COMPONENT_INACTIVE,
+    0,
+    es8311_enable,
+    es8311_disable,
+    es8311_reset,
+    es8311_get_type_and_id,
+    es8311_handle,
+};
+
+
+
+extern int I2CInit(void);
+extern int I2CDeInit(void);
+extern void I2CWrite(unsigned char numid, unsigned short value);
+extern void I2CBurstWrite(unsigned char numid, unsigned char size, unsigned char *value);
+extern void I2CRead(unsigned char numid, unsigned char *value);
+extern void I2CBurstRead(unsigned char numid, unsigned char *value, int size, int offset);
+
+#ifdef PXA1826_AUDIO
+#ifndef ACM_ALSA_INIT
+#define ACM_ALSA_INIT
+#endif
+#endif
+
+#ifdef DEBUG_FAKE_ACH
+#undef ACM_ALSA_INIT
+#endif
+
+
+static void es8311_reg_set(unsigned char numid, unsigned char value)
+{
+#ifndef DEBUG_FAKE_ACH
+		I2CWrite(numid, value);
+#else
+		LOGD(es8311_reg_set, "FAKE_ACH: %s(0x%x, 0x%x)", __FUNCTION__, numid, value);
+#endif
+}
+
+
+
+static void es8311_reg_get(unsigned char numid, unsigned char *value)
+{
+#ifndef DEBUG_FAKE_ACH
+		I2CRead(numid, value);
+#else
+		LOGD(es8311_reg_get, "FAKE_ACH: %s(0x%x, 0x%x)", __FUNCTION__, numid, value);
+#endif
+}
+
+//--------------------------------------------------------------
+//-------- External ACH APIs
+//--------------------------------------------------------------
+#ifdef ACM_ALSA_INIT
+static int _acm_initialized = 0;
+#endif
+
+
+static void es8311_enable(void)
+{
+	LOGI(es8311_enable, "%s: enter", __FUNCTION__);
+#ifdef ACM_ALSA_INIT
+	LOGI(es8311_enable, "%s: acm alsa query init_state[%d]", __FUNCTION__, _acm_initialized);
+	_acm_initialized = 1;
+	I2CInit();
+#endif
+}
+
+static void es8311_disable(void)
+{
+	LOGI(es8311_enable, "%s: enter", __FUNCTION__);
+#ifdef ACM_ALSA_INIT
+	LOGI(es8311_enable, "%s: acm alsa query init_state[%d]", __FUNCTION__, _acm_initialized);
+	if(!_acm_initialized)
+	{
+		_acm_initialized = 1;
+		I2CInit();
+	}
+
+	I2CDeInit();
+#endif
+
+}
+
+
+static void es8311_reset(void)
+{
+	LOGI(es8311_enable, "%s: enter", __FUNCTION__);
+	/* don't care cache reg , do nothing */
+}
+
+
+static void es8311_get_type_and_id(int * type, unsigned char * id)
+{
+	LOGI(es8311_enable, "%s: enter", __FUNCTION__);
+#ifdef ACM_ALSA_INIT
+	if(!_acm_initialized)
+	{
+		_acm_initialized = 1;
+		I2CInit();	
+	}
+#endif
+	es8311_reg_get(ES8311_ID_REG , id);
+
+#ifdef ACM_ALSA_INIT
+	I2CDeInit();
+#endif
+	
+}
+
+
+static unsigned char es88311_reg_list[] = {
+	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
+	0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13,
+	0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1E,
+	0x31, 0x32, 0x33, 0x34, 0x35, 0x37, 0x44, 0x45,
+};
+
+static int es8311_get_ctl_id(unsigned char reg_index)
+{
+	int index = 0;
+	for(index = 0; index < sizeof(es88311_reg_list); index++)
+	{
+		if(reg_index == es88311_reg_list[index])
+		{
+			return index;
+		}
+	}
+
+	return -1;
+}
+
+static ACH_ReturnCode es8311_handle(void * setting)
+{
+	unsigned char value = 0;
+	unsigned char ctl_id = 0;
+	
+	ACH_ComponentParameter *param = (ACH_ComponentParameter *)setting;
+	if(param && param->i2c.reg_value)
+	{
+		if(param->i2c.length == 2)
+		{
+			value = *(param->i2c.reg_value) & 0xff;
+		}
+
+		ctl_id = es8311_get_ctl_id(param->i2c.reg_index);
+		if(ctl_id < 0)
+		{
+			return ACH_RC_OK;
+		}
+
+		LOGE(es8311_handle, "%s: write ctl[%d], value[%02x]", __FUNCTION__, ctl_id, value);
+		es8311_reg_set(ctl_id, value);
+	}
+
+	return ACH_RC_OK;
+}
+
+
diff --git a/marvell/services/audio/libacm/acm/src/acm_nau8810.h b/marvell/services/audio/libacm/acm/src/acm_nau8810.h
old mode 100644
new mode 100755
index 5183cfe..05bc0b0
--- a/marvell/services/audio/libacm/acm/src/acm_nau8810.h
+++ b/marvell/services/audio/libacm/acm/src/acm_nau8810.h
@@ -213,6 +213,8 @@
     "USTICA",
     "DELAY",
     "NAU8810",
+     "ES8311",
+    "TLV320AIC3X",
     "ALC5616"
 } ;
 #endif
diff --git a/marvell/services/audio/libacm/acm/src/acm_tlv320aic3x.h b/marvell/services/audio/libacm/acm/src/acm_tlv320aic3x.h
new file mode 100755
index 0000000..48a9c70
--- /dev/null
+++ b/marvell/services/audio/libacm/acm/src/acm_tlv320aic3x.h
@@ -0,0 +1,277 @@
+/*
+ * ASR Audio path definition of TLV320AIC3X 
+ *
+ * Copyright (C) 2018 ASR Microelectronic Ltd.
+ *
+ * Author: Chen wen<wenchen@asrmicro.com>
+ *
+ * This file contains proprietary information.
+ * No dissemination allowed without prior written permission from
+ * ASR Microelectronic Ltd.
+ *
+ * File Description:
+ *
+ * This file contains header for audio path definition of TLV320AIC3X 
+ */
+
+#ifndef ACM_TLV320AIC3X_H
+#define ACM_TLV320AIC3X_H
+
+#define CODEC_TLV320AIC3X_VOICE_REG70         0x70
+#define CODEC_TLV320AIC3X_VOICE_MASTER        0x0082   //bit15=0 master
+#define CODEC_TLV320AIC3X_VOICE_SLAVE         0x8082   //bit15=1 slave
+
+//////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////
+/////////////////////////APH_PATH_ID_HIFIPLAYTOEARPHONE//////////////////////////
+ACMAPH_Register ACM_HiFiPlayToEarphone_Disable[]={
+    {TLV320AIC3X, 0x70, 0x8000},                        {TLV320AIC3X, 0x63, 0x00C6},{TLV320AIC3X, 0x3D, 0x2000},{TLV320AIC3X, 0x61, 0x8000},
+    {TLV320AIC3X, 0x62, 0x0000},{TLV320AIC3X, 0x65, 0x0000},{TLV320AIC3X, 0x66, 0x0000},{TLV320AIC3X, 0x8E, 0x0000},{TLV320AIC3X, 0x8F, 0x1100},
+    {TLV320AIC3X, 0x2A, 0x5252},{TLV320AIC3X, 0x4F, 0x0279},{TLV320AIC3X, 0x52, 0x0279},{TLV320AIC3X, 0x53, 0xF000},{TLV320AIC3X, 0x03, 0xC8C8},
+    {TLV320AIC3X, 0x05, 0x0000}
+};
+ACMAPH_Register ACM_HiFiPlayToEarphone_Enable[]={
+    {TLV320AIC3X, 0x70, CODEC_TLV320AIC3X_VOICE_SLAVE},     {TLV320AIC3X, 0x63, 0xF8DE},{TLV320AIC3X, 0x3D, 0x3600},{TLV320AIC3X, 0x61, 0x9804},
+    {TLV320AIC3X, 0x62, 0x8800},{TLV320AIC3X, 0x65, 0xC800},{TLV320AIC3X, 0x66, 0x3000},{TLV320AIC3X, 0x8E, 0x0008},{TLV320AIC3X, 0x8F, 0x3100},
+    {TLV320AIC3X, 0x2A, 0x1250},{TLV320AIC3X, 0x4F, 0x0278},{TLV320AIC3X, 0x52, 0x0278},{TLV320AIC3X, 0x53, 0xC000},{TLV320AIC3X, 0x03, 0x0808},
+    {TLV320AIC3X, 0x05, 0x8000}
+};
+
+/////////////////////////APH_PATH_ID_HIFIPLAYTOSPKR//////////////////////////
+ACMAPH_Register ACM_HiFiPlayToSPKR_Disable[]={
+    {TLV320AIC3X, 0x70, 0x8000},                        {TLV320AIC3X, 0x63, 0x00C6},{TLV320AIC3X, 0x3D, 0x2000},{TLV320AIC3X, 0x61, 0x8000},
+    {TLV320AIC3X, 0x62, 0x0000},{TLV320AIC3X, 0x65, 0x0000},{TLV320AIC3X, 0x66, 0x0000},{TLV320AIC3X, 0x8E, 0x0000},{TLV320AIC3X, 0x8F, 0x1100},
+    {TLV320AIC3X, 0x2A, 0x5252},{TLV320AIC3X, 0x4F, 0x0279},{TLV320AIC3X, 0x52, 0x0279},{TLV320AIC3X, 0x53, 0xF000},{TLV320AIC3X, 0x03, 0xC8C8},
+    {TLV320AIC3X, 0x05, 0x0000}
+};
+ACMAPH_Register ACM_HiFiPlayToSPKR_Enable[]={
+    {TLV320AIC3X, 0x70, CODEC_TLV320AIC3X_VOICE_SLAVE},     {TLV320AIC3X, 0x63, 0xF8DE},{TLV320AIC3X, 0x3D, 0x3600},{TLV320AIC3X, 0x61, 0x9804},
+    {TLV320AIC3X, 0x62, 0x8800},{TLV320AIC3X, 0x65, 0xC800},{TLV320AIC3X, 0x66, 0x3000},{TLV320AIC3X, 0x8E, 0x0008},{TLV320AIC3X, 0x8F, 0x3100},
+    {TLV320AIC3X, 0x2A, 0x1250},{TLV320AIC3X, 0x4F, 0x0278},{TLV320AIC3X, 0x52, 0x0278},{TLV320AIC3X, 0x53, 0xC000},{TLV320AIC3X, 0x03, 0x0808},
+    {TLV320AIC3X, 0x05, 0x8000}
+};
+
+/////////////////////////APH_PATH_ID_HIFIPLAYTOHP//////////////////////////
+ACMAPH_Register ACM_HiFiPlayToHP_Disable[]={
+    {TLV320AIC3X, 0x70, 0x8000},                        {TLV320AIC3X, 0x63, 0x00C6},{TLV320AIC3X, 0x3D, 0x2000},{TLV320AIC3X, 0x61, 0x8000},
+    {TLV320AIC3X, 0x62, 0x0000},{TLV320AIC3X, 0x65, 0x0000},{TLV320AIC3X, 0x66, 0x0000},{TLV320AIC3X, 0x8E, 0x0000},{TLV320AIC3X, 0x8F, 0x1100},
+    {TLV320AIC3X, 0x2A, 0x5252},{TLV320AIC3X, 0x4F, 0x0279},{TLV320AIC3X, 0x52, 0x0279},{TLV320AIC3X, 0x45, 0x7000},{TLV320AIC3X, 0x02, 0xC8C8},
+    {TLV320AIC3X, 0x1E, 0x0000},{TLV320AIC3X, 0xD3, 0xB320}
+};
+ACMAPH_Register ACM_HiFiPlayToHP_Enable[]={
+    {TLV320AIC3X, 0x70, CODEC_TLV320AIC3X_VOICE_SLAVE},     {TLV320AIC3X, 0x63, 0xE8DE},{TLV320AIC3X, 0x3D, 0x3600},{TLV320AIC3X, 0x61, 0x9804},
+    {TLV320AIC3X, 0x62, 0x8800},{TLV320AIC3X, 0x65, 0xCC00},{TLV320AIC3X, 0x66, 0x0C00},{TLV320AIC3X, 0x8E, 0x001D},{TLV320AIC3X, 0x8F, 0x3100},
+    {TLV320AIC3X, 0x2A, 0x1250},{TLV320AIC3X, 0x4F, 0x0278},{TLV320AIC3X, 0x52, 0x0278},{TLV320AIC3X, 0x45, 0x5000},{TLV320AIC3X, 0x02, 0x0808},
+    {TLV320AIC3X, 0x1E, 0x8000},{TLV320AIC3X, 0xD3, 0x2A00}
+};
+
+/////////////////////////APH_PATH_ID_HIFIRECORDFROMMIC1//////////////////////////
+ACMAPH_Register ACM_HiFiRecordFromMic1_Disable[]={
+    {TLV320AIC3X, 0x70, 0x8000},                        {TLV320AIC3X, 0x63, 0x00C6},{TLV320AIC3X, 0x3D, 0x2000},{TLV320AIC3X, 0x61, 0x8000},
+    {TLV320AIC3X, 0x62, 0x0000},{TLV320AIC3X, 0x65, 0x0000},{TLV320AIC3X, 0x0D, 0x0000},{TLV320AIC3X, 0x3C, 0x006F},{TLV320AIC3X, 0x3E, 0x006F},
+    {TLV320AIC3X, 0x27, 0x7860},
+#if defined(TARGET_mmp_asr1901_KSTR901) && defined(CODEC_PCM_48KHz)
+    {TLV320AIC3X, 0x64, 0x0204}
+#else
+    {TLV320AIC3X, 0x64, 0x0004}
+#endif
+};
+ACMAPH_Register ACM_HiFiRecordFromMic1_Enable[]={
+    {TLV320AIC3X, 0x70, CODEC_TLV320AIC3X_VOICE_SLAVE},     {TLV320AIC3X, 0x63, 0xF8DE},{TLV320AIC3X, 0x3D, 0x3600},{TLV320AIC3X, 0x61, 0x9804},
+    {TLV320AIC3X, 0x62, 0x8800},{TLV320AIC3X, 0x65, 0xC800},{TLV320AIC3X, 0x0D, 0x0540},{TLV320AIC3X, 0x3C, 0x006B},{TLV320AIC3X, 0x3E, 0x006B},
+    {TLV320AIC3X, 0x27, 0x3860},
+#if defined(TARGET_mmp_asr1901_KSTR901) && defined(CODEC_PCM_48KHz)
+    {TLV320AIC3X, 0x64, 0x4A04}
+#else
+    {TLV320AIC3X, 0x64, 0x4804}
+#endif
+};
+ACMAPH_Register ACM_HiFiRecordFromMic1_Mute[]={
+    {TLV320AIC3X, 0x1C, 0xAFAF},
+};
+ACMAPH_Register ACM_HiFiRecordFromMic1_UnMute[]={
+    {TLV320AIC3X, 0x1C, 0x4141},
+};
+/////////////////////////APH_PATH_ID_HIFIRECORDFROMHSMIC//////////////////////////
+ACMAPH_Register ACM_HiFiRecordFromHsMic_Disable[]={
+    {TLV320AIC3X, 0x70, 0x8000},                        {TLV320AIC3X, 0x63, 0x00C6},{TLV320AIC3X, 0x3D, 0x2000},{TLV320AIC3X, 0x61, 0x8000},
+    {TLV320AIC3X, 0x62, 0x0000},{TLV320AIC3X, 0x65, 0x0000},{TLV320AIC3X, 0x0D, 0x0540},{TLV320AIC3X, 0x3C, 0x006F},{TLV320AIC3X, 0x3E, 0x006F},
+    {TLV320AIC3X, 0x27, 0x7860},
+#if defined(TARGET_mmp_asr1901_KSTR901) && defined(CODEC_PCM_48KHz)
+    {TLV320AIC3X, 0x64, 0x0204}
+#else
+    {TLV320AIC3X, 0x64, 0x0004}
+#endif
+};
+ACMAPH_Register ACM_HiFiRecordFromHsMic_Enable[]={
+    {TLV320AIC3X, 0x70, CODEC_TLV320AIC3X_VOICE_SLAVE},     {TLV320AIC3X, 0x63, 0xE8DE},{TLV320AIC3X, 0x3D, 0x3600},{TLV320AIC3X, 0x61, 0x9804},
+    {TLV320AIC3X, 0x62, 0x8800},{TLV320AIC3X, 0x65, 0xCC00},{TLV320AIC3X, 0x0D, 0x0000},{TLV320AIC3X, 0x3C, 0x006D},{TLV320AIC3X, 0x3E, 0x006D},
+    {TLV320AIC3X, 0x27, 0x3820},
+#if defined(TARGET_mmp_asr1901_KSTR901) && defined(CODEC_PCM_48KHz)
+    {TLV320AIC3X, 0x64, 0x8A24}
+#else
+    {TLV320AIC3X, 0x64, 0x8824}
+#endif
+};
+ACMAPH_Register ACM_HiFiRecordFromHsMic_Mute[]={
+    {TLV320AIC3X, 0x1C, 0xAFAF},
+};
+ACMAPH_Register ACM_HiFiRecordFromHsMic_UnMute[]={
+    {TLV320AIC3X, 0x1C, 0x4141},
+};
+//////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////
+/////////////////////////APH_PATH_ID_VOICEPLAYTOEARPHONE//////////////////////////
+
+ACMAPH_Register ACM_VoicePlayToEarphone_Disable[]={
+    {TLV320AIC3X, 0x70, 0x8000},                        {TLV320AIC3X, 0x63, 0x00C6},{TLV320AIC3X, 0x3D, 0x2000},{TLV320AIC3X, 0x61, 0x8000},
+    {TLV320AIC3X, 0x62, 0x0000},{TLV320AIC3X, 0x65, 0x0000},{TLV320AIC3X, 0x66, 0x0000},{TLV320AIC3X, 0x8E, 0x0000},{TLV320AIC3X, 0x8F, 0x1100},
+    {TLV320AIC3X, 0x2A, 0x5252},{TLV320AIC3X, 0x4F, 0x0279},{TLV320AIC3X, 0x52, 0x0279},{TLV320AIC3X, 0x53, 0xF000},{TLV320AIC3X, 0x03, 0xC8C8},
+    {TLV320AIC3X, 0x05, 0x0000}
+};
+ACMAPH_Register ACM_VoicePlayToEarphone_Enable[]={
+    {TLV320AIC3X, 0x70, CODEC_TLV320AIC3X_VOICE_SLAVE},     {TLV320AIC3X, 0x63, 0xF8DE},{TLV320AIC3X, 0x3D, 0x3600},{TLV320AIC3X, 0x61, 0x9804},
+    {TLV320AIC3X, 0x62, 0x8800},{TLV320AIC3X, 0x65, 0xC800},{TLV320AIC3X, 0x66, 0x3000},{TLV320AIC3X, 0x8E, 0x0008},{TLV320AIC3X, 0x8F, 0x3100},
+    {TLV320AIC3X, 0x2A, 0x1250},{TLV320AIC3X, 0x4F, 0x0278},{TLV320AIC3X, 0x52, 0x0278},{TLV320AIC3X, 0x53, 0xC000},{TLV320AIC3X, 0x03, 0x0808},
+    {TLV320AIC3X, 0x05, 0x8000}
+};
+
+/////////////////////////APH_PATH_ID_VOICEPLAYTOSPKR//////////////////////////
+ACMAPH_Register ACM_VoicePlayToSPKR_Disable[]={
+    {TLV320AIC3X, 0x70, 0x8000},                        {TLV320AIC3X, 0x63, 0x00C6},{TLV320AIC3X, 0x3D, 0x2000},{TLV320AIC3X, 0x61, 0x8000},
+    {TLV320AIC3X, 0x62, 0x0000},{TLV320AIC3X, 0x65, 0x0000},{TLV320AIC3X, 0x66, 0x0000},{TLV320AIC3X, 0x8E, 0x0000},{TLV320AIC3X, 0x8F, 0x1100},
+    {TLV320AIC3X, 0x2A, 0x5252},{TLV320AIC3X, 0x4F, 0x0279},{TLV320AIC3X, 0x52, 0x0279},{TLV320AIC3X, 0x53, 0xF000},{TLV320AIC3X, 0x03, 0xC8C8},
+    {TLV320AIC3X, 0x05, 0x0000}
+};
+ACMAPH_Register ACM_VoicePlayToSPKR_Enable[]={
+    {TLV320AIC3X, 0x70, CODEC_TLV320AIC3X_VOICE_SLAVE},     {TLV320AIC3X, 0x63, 0xF8DE},{TLV320AIC3X, 0x3D, 0x3600},{TLV320AIC3X, 0x61, 0x9804},
+    {TLV320AIC3X, 0x62, 0x8800},{TLV320AIC3X, 0x65, 0xC800},{TLV320AIC3X, 0x66, 0x3000},{TLV320AIC3X, 0x8E, 0x0008},{TLV320AIC3X, 0x8F, 0x3100},
+    {TLV320AIC3X, 0x2A, 0x1250},{TLV320AIC3X, 0x4F, 0x0278},{TLV320AIC3X, 0x52, 0x0278},{TLV320AIC3X, 0x53, 0xC000},{TLV320AIC3X, 0x03, 0x0808},
+    {TLV320AIC3X, 0x05, 0x8000}
+};
+
+/////////////////////////APH_PATH_ID_VOICEPLAYTOHP//////////////////////////
+ACMAPH_Register ACM_VoicePlayToHP_Disable[]={
+    {TLV320AIC3X, 0x70, 0x8000},                        {TLV320AIC3X, 0x63, 0x00C6},{TLV320AIC3X, 0x3D, 0x2000},{TLV320AIC3X, 0x61, 0x8000},
+    {TLV320AIC3X, 0x62, 0x0000},{TLV320AIC3X, 0x65, 0x0000},{TLV320AIC3X, 0x66, 0x0000},{TLV320AIC3X, 0x8E, 0x0000},{TLV320AIC3X, 0x8F, 0x1100},
+    {TLV320AIC3X, 0x2A, 0x5252},{TLV320AIC3X, 0x4F, 0x0279},{TLV320AIC3X, 0x52, 0x0279},{TLV320AIC3X, 0x45, 0x7000},{TLV320AIC3X, 0x02, 0xC8C8},
+    {TLV320AIC3X, 0x1E, 0x0000},{TLV320AIC3X, 0xD3, 0xB320}
+};
+ACMAPH_Register ACM_VoicePlayToHP_Enable[]={
+    {TLV320AIC3X, 0x70, CODEC_TLV320AIC3X_VOICE_SLAVE},     {TLV320AIC3X, 0x63, 0xE8DE},{TLV320AIC3X, 0x3D, 0x3600},{TLV320AIC3X, 0x61, 0x9804},
+    {TLV320AIC3X, 0x62, 0x8800},{TLV320AIC3X, 0x65, 0xCC00},{TLV320AIC3X, 0x66, 0x0C00},{TLV320AIC3X, 0x8E, 0x001D},{TLV320AIC3X, 0x8F, 0x3100},
+    {TLV320AIC3X, 0x2A, 0x1250},{TLV320AIC3X, 0x4F, 0x0278},{TLV320AIC3X, 0x52, 0x0278},{TLV320AIC3X, 0x45, 0x5000},{TLV320AIC3X, 0x02, 0x0808},
+    {TLV320AIC3X, 0x1E, 0x8000},{TLV320AIC3X, 0xD3, 0x2A00}
+};
+
+/////////////////////////APH_PATH_ID_VOICERECORDFROMMIC1//////////////////////////
+ACMAPH_Register ACM_VoiceRecordFromMic1_Disable[]={
+    {TLV320AIC3X, 0x70, 0x8000},                        {TLV320AIC3X, 0x63, 0x00C6},{TLV320AIC3X, 0x3D, 0x2000},{TLV320AIC3X, 0x61, 0x8000},
+    {TLV320AIC3X, 0x62, 0x0000},{TLV320AIC3X, 0x65, 0x0000},{TLV320AIC3X, 0x0D, 0x0000},{TLV320AIC3X, 0x3C, 0x006F},{TLV320AIC3X, 0x3E, 0x006F},
+    {TLV320AIC3X, 0x27, 0x7860},
+#if defined(TARGET_mmp_asr1901_KSTR901) && defined(CODEC_PCM_48KHz)
+    {TLV320AIC3X, 0x64, 0x0204}
+#else
+    {TLV320AIC3X, 0x64, 0x0004}
+#endif
+};
+ACMAPH_Register ACM_VoiceRecordFromMic1_Enable[]={
+    {TLV320AIC3X, 0x70, CODEC_TLV320AIC3X_VOICE_SLAVE},     {TLV320AIC3X, 0x63, 0xF8DE},{TLV320AIC3X, 0x3D, 0x3600},{TLV320AIC3X, 0x61, 0x9804},
+    {TLV320AIC3X, 0x62, 0x8800},{TLV320AIC3X, 0x65, 0xC800},{TLV320AIC3X, 0x0D, 0x0540},{TLV320AIC3X, 0x3C, 0x006B},{TLV320AIC3X, 0x3E, 0x006B},
+    {TLV320AIC3X, 0x27, 0x3860},
+#if defined(TARGET_mmp_asr1901_KSTR901) && defined(CODEC_PCM_48KHz)
+    {TLV320AIC3X, 0x64, 0x4A04}
+#else
+    {TLV320AIC3X, 0x64, 0x4804}
+#endif
+};
+ACMAPH_Register ACM_VoiceRecordFromMic1_Mute[]={
+    {TLV320AIC3X, 0x1C, 0xAFAF},
+};
+ACMAPH_Register ACM_VoiceRecordFromMic1_UnMute[]={
+    {TLV320AIC3X, 0x1C, 0x4141},
+};
+/////////////////////////APH_PATH_ID_VOICERECORDFROMHSMIC//////////////////////////
+ACMAPH_Register ACM_VoiceRecordFromHsMic_Disable[]={
+    {TLV320AIC3X, 0x70, 0x8000},                        {TLV320AIC3X, 0x63, 0x00C6},{TLV320AIC3X, 0x3D, 0x2000},{TLV320AIC3X, 0x61, 0x8000},
+    {TLV320AIC3X, 0x62, 0x0000},{TLV320AIC3X, 0x65, 0x0000},{TLV320AIC3X, 0x0D, 0x0540},{TLV320AIC3X, 0x3C, 0x006F},{TLV320AIC3X, 0x3E, 0x006F},
+    {TLV320AIC3X, 0x27, 0x7860},
+#if defined(TARGET_mmp_asr1901_KSTR901) && defined(CODEC_PCM_48KHz)
+    {TLV320AIC3X, 0x64, 0x0204}
+#else
+    {TLV320AIC3X, 0x64, 0x0004}
+#endif
+};
+ACMAPH_Register ACM_VoiceRecordFromHsMic_Enable[]={
+    {TLV320AIC3X, 0x70, CODEC_TLV320AIC3X_VOICE_SLAVE},     {TLV320AIC3X, 0x63, 0xE8DE},{TLV320AIC3X, 0x3D, 0x3600},{TLV320AIC3X, 0x61, 0x9804},
+    {TLV320AIC3X, 0x62, 0x8800},{TLV320AIC3X, 0x65, 0xCC00},{TLV320AIC3X, 0x0D, 0x0000},{TLV320AIC3X, 0x3C, 0x006D},{TLV320AIC3X, 0x3E, 0x006D},
+    {TLV320AIC3X, 0x27, 0x3820},
+#if defined(TARGET_mmp_asr1901_KSTR901) && defined(CODEC_PCM_48KHz)
+    {TLV320AIC3X, 0x64, 0x8A24}
+#else
+    {TLV320AIC3X, 0x64, 0x8824}
+#endif
+};
+ACMAPH_Register ACM_VoiceRecordFromHsMic_Mute[]={
+    {TLV320AIC3X, 0x1C, 0xAFAF},
+};
+ACMAPH_Register ACM_VoiceRecordFromHsMic_UnMute[]={
+    {TLV320AIC3X, 0x1C, 0x4141},
+};
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+static ACMAPH_Component ACM_Disable[APH_PATH_ID_CNT]={
+    {APH_PATH_ID_HIFIPLAYTOEARPHONE,    ACM_HiFiPlayToEarphone_Disable,     sizeof(ACM_HiFiPlayToEarphone_Disable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_HIFIPLAYTOSPKR,        ACM_HiFiPlayToSPKR_Disable,         sizeof(ACM_HiFiPlayToSPKR_Disable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_HIFIPLAYTOHP,          ACM_HiFiPlayToHP_Disable,           sizeof(ACM_HiFiPlayToHP_Disable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_HIFIRECORDFROMMIC1,    ACM_HiFiRecordFromMic1_Disable,     sizeof(ACM_HiFiRecordFromMic1_Disable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_HIFIRECORDFROMHSMIC,   ACM_HiFiRecordFromHsMic_Disable,    sizeof(ACM_HiFiRecordFromHsMic_Disable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_VOICEPLAYTOEARPHONE,   ACM_VoicePlayToEarphone_Disable,    sizeof(ACM_VoicePlayToEarphone_Disable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_VOICEPLAYTOSPKR,       ACM_VoicePlayToSPKR_Disable,        sizeof(ACM_VoicePlayToSPKR_Disable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_VOICEPLAYTOHP,         ACM_VoicePlayToHP_Disable,          sizeof(ACM_VoicePlayToHP_Disable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_VOICERECORDFROMMIC1,   ACM_VoiceRecordFromMic1_Disable,    sizeof(ACM_VoiceRecordFromMic1_Disable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_VOICERECORDFROMHSMIC,  ACM_VoiceRecordFromHsMic_Disable,   sizeof(ACM_VoiceRecordFromHsMic_Disable)/sizeof(ACMAPH_Register)},
+};
+
+static ACMAPH_Component ACM_Enable[APH_PATH_ID_CNT]={
+    {APH_PATH_ID_HIFIPLAYTOEARPHONE,    ACM_HiFiPlayToEarphone_Enable,      sizeof(ACM_HiFiPlayToEarphone_Enable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_HIFIPLAYTOSPKR,        ACM_HiFiPlayToSPKR_Enable,          sizeof(ACM_HiFiPlayToSPKR_Enable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_HIFIPLAYTOHP,          ACM_HiFiPlayToHP_Enable,            sizeof(ACM_HiFiPlayToHP_Enable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_HIFIRECORDFROMMIC1,    ACM_HiFiRecordFromMic1_Enable,      sizeof(ACM_HiFiRecordFromMic1_Enable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_HIFIRECORDFROMHSMIC,   ACM_HiFiRecordFromHsMic_Enable,     sizeof(ACM_HiFiRecordFromHsMic_Enable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_VOICEPLAYTOEARPHONE,   ACM_VoicePlayToEarphone_Enable,     sizeof(ACM_VoicePlayToEarphone_Enable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_VOICEPLAYTOSPKR,       ACM_VoicePlayToSPKR_Enable,         sizeof(ACM_VoicePlayToSPKR_Enable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_VOICEPLAYTOHP,         ACM_VoicePlayToHP_Enable,           sizeof(ACM_VoicePlayToHP_Enable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_VOICERECORDFROMMIC1,   ACM_VoiceRecordFromMic1_Enable,     sizeof(ACM_VoiceRecordFromMic1_Enable)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_VOICERECORDFROMHSMIC,  ACM_VoiceRecordFromHsMic_Enable,    sizeof(ACM_VoiceRecordFromHsMic_Enable)/sizeof(ACMAPH_Register)},
+};
+
+static ACMAPH_Component ACM_Mute[APH_PATH_IN_CNT]={
+    {APH_PATH_ID_HIFIRECORDFROMMIC1,    ACM_HiFiRecordFromMic1_Mute,      sizeof(ACM_HiFiRecordFromMic1_Mute)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_HIFIRECORDFROMHSMIC,   ACM_HiFiRecordFromHsMic_Mute,     sizeof(ACM_HiFiRecordFromHsMic_Mute)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_VOICERECORDFROMMIC1,   ACM_VoiceRecordFromMic1_Mute,     sizeof(ACM_VoiceRecordFromMic1_Mute)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_VOICERECORDFROMHSMIC,  ACM_VoiceRecordFromHsMic_Mute,    sizeof(ACM_VoiceRecordFromHsMic_Mute)/sizeof(ACMAPH_Register)},
+};
+static ACMAPH_Component ACM_UnMute[APH_PATH_IN_CNT]={
+    {APH_PATH_ID_HIFIRECORDFROMMIC1,    ACM_HiFiRecordFromMic1_UnMute,      sizeof(ACM_HiFiRecordFromMic1_UnMute)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_HIFIRECORDFROMHSMIC,   ACM_HiFiRecordFromHsMic_UnMute,     sizeof(ACM_HiFiRecordFromHsMic_UnMute)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_VOICERECORDFROMMIC1,   ACM_VoiceRecordFromMic1_UnMute,     sizeof(ACM_VoiceRecordFromMic1_UnMute)/sizeof(ACMAPH_Register)},
+    {APH_PATH_ID_VOICERECORDFROMHSMIC,  ACM_VoiceRecordFromHsMic_UnMute,    sizeof(ACM_VoiceRecordFromHsMic_UnMute)/sizeof(ACMAPH_Register)},
+};
+
+extern ACH_ComponentHandler TLV320AIC3X_handler;
+
+static APH_ACHComponent ACH_component_table[] = {
+    {TLV320AIC3X, &TLV320AIC3X_handler},
+};
+//Sorted as APH_AudioComponent
+static char APH_AudioComponent_Name[][16]= {
+    "ELBA",
+    "USTICA",
+    "DELAY",
+    "NAU8810",
+     "ES8311",
+    "TLV320AIC3X",
+    "ALC5616"
+} ;
+#endif
diff --git a/marvell/services/audio/libacm/acm/src/acm_tlv320aic3x_handle.c b/marvell/services/audio/libacm/acm/src/acm_tlv320aic3x_handle.c
new file mode 100755
index 0000000..b40aba9
--- /dev/null
+++ b/marvell/services/audio/libacm/acm/src/acm_tlv320aic3x_handle.c
@@ -0,0 +1,229 @@
+/*
+ * All Rights Reserved
+ *
+ * MARVELL CONFIDENTIAL
+ * Copyright 2012 Marvell International Ltd All Rights Reserved.
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Marvell International Ltd or its
+ * suppliers or licensors. Title to the Material remains with Marvell International Ltd
+ * or its suppliers and licensors. The Material contains trade secrets and
+ * proprietary and confidential information of Marvell or its suppliers and
+ * licensors. The Material is protected by worldwide copyright and trade secret
+ * laws and treaty provisions. No part of the Material may be used, copied,
+ * reproduced, modified, published, uploaded, posted, transmitted, distributed,
+ * or disclosed in any way without Marvell's prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Marvell in writing.
+ *
+ */
+
+#define LOG_TAG "acm_ach_tlv320aic3x"
+#define LOG_NDEBUG 0
+
+#include <cutils/log.h>
+#include "acm_tlv320aic3x_handle.h"
+
+int codec_reg_num = NUM_OF_REGS;
+
+static void TLV320AIC3X_Enable(void);
+static void TLV320AIC3X_Disable(void);
+static void TLV320AIC3X_Reset(void);
+static void TLV320AIC3X_GetTypeAndID(int *type, unsigned char *id);
+static ACH_ReturnCode TLV320AIC3X_Handle(void *setting);
+
+ACH_ComponentHandler TLV320AIC3X_handler = {
+    COMPONENT_INACTIVE,
+    0,
+    TLV320AIC3X_Enable,
+    TLV320AIC3X_Disable,
+    TLV320AIC3X_Reset,
+    TLV320AIC3X_GetTypeAndID,
+    TLV320AIC3X_Handle,
+};
+
+extern int I2CInit(void);
+extern int I2CDeInit(void);
+extern void I2CWrite(unsigned char numid, unsigned short value);
+extern void I2CBurstWrite(unsigned char numid, unsigned char size, unsigned char *value);
+extern void I2CRead(unsigned char numid, unsigned char *value);
+extern void I2CBurstRead(unsigned char numid, unsigned char *value, int size, int offset);
+
+#ifdef PXA1826_AUDIO
+#ifndef ACM_ALSA_INIT
+#define ACM_ALSA_INIT
+#endif
+#endif
+
+#ifdef DEBUG_FAKE_ACH
+#undef ACM_ALSA_INIT
+#endif
+
+
+static void TLV320AIC3X_RegSet(unsigned char numid, unsigned short value) {
+#ifndef DEBUG_FAKE_ACH
+    I2CWrite(numid, value);
+#else
+    LOGD(TLV320AIC3X_RegSet, "  FAKE_ACH: %s(0x%x, 0x%x)", __FUNCTION__, numid, value);
+#endif
+}
+
+static void TLV320AIC3X_RegBurstSet(unsigned char numid, unsigned char size, unsigned char *value) {
+#ifndef DEBUG_FAKE_ACH
+    I2CBurstWrite(numid, size, value);
+#else
+    LOGD(TLV320AIC3X_RegBurstSet, "  FAKE_ACH: %s(0x%x, 0x%x, ..)", __FUNCTION__, numid, size);
+#endif
+}
+
+void TLV320AIC3X_RegGet(unsigned char numid, unsigned char *value) {
+#ifndef DEBUG_FAKE_ACH
+    I2CRead(numid, value);
+#else
+    LOGD(TLV320AIC3X_RegGet, "  FAKE_ACH: %s(0x%x, ..)", __FUNCTION__, numid);
+#endif
+}
+
+void TLV320AIC3X_RegBurstGet(unsigned char numid, unsigned char *value, int size, int offset) {
+#ifndef DEBUG_FAKE_ACH
+    I2CBurstRead(numid, value, size, offset);
+#else
+    LOGD(TLV320AIC3X_RegBurstGet, "  FAKE_ACH: %s(0x%x, .., 0x%x, 0x%x)", __FUNCTION__, numid, size, offset);
+#endif
+}
+
+static void TLV320AIC3X_ResetRegCache() {
+    int size = sizeof(reg_cache) / sizeof(reg_cache[0]);
+    int i = 0;
+
+    for (i = 0; i < size; i++) {
+        reg_cache[i].reg_value = reg_cache[i].reg_default;
+    }
+}
+
+unsigned char TLV320AIC3X_GetRegNumId(unsigned char reg_index) {
+    unsigned char i = 0;
+
+    for (i = 0; i < NUM_OF_REGS; i++) {
+        if (reg_cache[i].reg_index == reg_index) {
+            return REG_NUMID_BASE + i;
+        }
+    }
+
+    return 0;
+}
+
+//--------------------------------------------------------------
+//-------- External ACH APIs
+//--------------------------------------------------------------
+#ifdef ACM_ALSA_INIT
+// NOTE about pair Enable/Disable
+//  On startup Disable could be called without Enable as Init/Reset sequence
+//  Let's "force" I2CInit() for first only Disable without Enable
+//
+static int _acm_initialized = 0;
+#endif
+
+static void TLV320AIC3X_Enable(void) {
+    LOGI(TLV320AIC3X_Enable, "%s: enable TLV320AIC3X component", __FUNCTION__);
+
+#ifdef ACM_ALSA_INIT
+    LOGI(TLV320AIC3X_Enable, "%s: _acm_initialized=%d!", __FUNCTION__, _acm_initialized);
+    _acm_initialized = 1;
+    I2CInit(); //adaptor to alsa-mixer
+#endif
+
+}
+
+static void TLV320AIC3X_Disable(void) {
+    LOGI(TLV320AIC3X_Disable, "%s: disable TLV320AIC3X component", __FUNCTION__);
+
+#ifdef ACM_ALSA_INIT
+    if (!_acm_initialized) {
+        _acm_initialized = 1;
+        I2CInit(); //adaptor to alsa-mixer
+    }
+#endif
+
+#ifdef ACM_ALSA_INIT
+    I2CDeInit(); //adaptor to alsa-mixer
+#endif
+}
+
+static void TLV320AIC3X_Reset(void) {
+    LOGI(TLV320AIC3X_Reset, "%s: Reset TLV320AIC3X registers!", __FUNCTION__);
+    int size = sizeof(reg_cache) / sizeof(reg_cache[0]);
+    int size_col = sizeof(reg_cache[0]) / sizeof(unsigned char);
+    int i, k = 0;
+    unsigned char j, numid, value, cache_idx;
+    TLV320AIC3X_RegisterCache reg_cache_inorder[size];
+
+#ifdef ACM_ALSA_INIT
+    I2CInit(); //make sure to enable mixer before and close after this operation
+#endif
+
+#ifdef ACM_ALSA_INIT
+    I2CDeInit(); //make sure to enable mixer before and close after this operation
+#endif
+}
+
+static void TLV320AIC3X_GetTypeAndID(int *type, unsigned char *id) {
+#ifdef ACM_ALSA_INIT
+    I2CInit(); //make sure to enable mixer before and close after this operation
+#endif
+    LOGI(Elba_GetTypeAndID, "%s: Get type and ID for elba component", __FUNCTION__);
+    *type = COMPONENT_TYPE_CODEC;
+    TLV320AIC3X_RegGet(TLV320AIC3X_ID_REG, id);
+#ifdef ACM_ALSA_INIT
+    I2CDeInit(); //make sure to enable mixer before and close after this operation
+#endif
+}
+
+static ACH_ReturnCode TLV320AIC3X_Handle(void *setting) {
+    ACH_ComponentParameter *param = (ACH_ComponentParameter *)setting;
+    unsigned short i = 0;
+    unsigned short numid, value, cache_idx;
+
+    if (param && param->i2c.reg_value) {
+        numid = TLV320AIC3X_GetRegNumId(param->i2c.reg_index);
+
+        LOGI(TLV320AIC3X_Handle, "%s: REG_NUMID_BASE=%d, numid=%d. set register 0x%lx values:0x%lx ",
+                __FUNCTION__, REG_NUMID_BASE, numid, param->i2c.reg_index,  *(param->i2c.reg_value));
+
+        if (numid > 0) {
+            if (param->i2c.length == 2) {
+                //compare with register cache
+                cache_idx = numid - REG_NUMID_BASE;
+                value = (*param->i2c.reg_value);
+
+#ifdef DEBUG_TLV320AIC3X
+                LOGI(TLV320AIC3X_Handle, "%s: cache_idx=%d, numid=%d. set register 0x%lx [0x%lx --> 0x%lx]",
+                        __FUNCTION__,
+                        cache_idx,
+                        numid,
+                        param->i2c.reg_index,
+                        reg_cache[cache_idx].reg_value,
+                        value);
+#endif
+                reg_cache[cache_idx].reg_value = value;
+                TLV320AIC3X_RegSet(numid, value);
+
+            } else if (param->i2c.length > 2) {
+                //FIXME current no register cache is provided for mixer/eq configuration
+#ifdef DEBUG_TLV320AIC3X
+                LOGI(TLV320AIC3X_Handle2, "%s: numid=%d. set register 0x%lx values:", __FUNCTION__, numid, param->i2c.reg_index);
+                for (i = 0; i < param->i2c.length; i++) {
+                    LOGI(TLV320AIC3X_Handle3, "%s: \t\t\t    -->0x%lx", __FUNCTION__, param->i2c.reg_value[i]);
+                }
+#endif
+
+                TLV320AIC3X_RegBurstSet(numid, param->i2c.length, param->i2c.reg_value);
+            }
+        }
+    }
+
+    return ACH_RC_OK;
+}