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(¶m);
}
+#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;
+}