audio: Update from redwood-s-oss

Change-Id: Iff2fb143a43da2f2905bf77df30c8b6e4468a3f0
This commit is contained in:
Giovanni Ricca 2023-01-22 12:54:48 +01:00
parent 9e11ed878f
commit d7f4b8d1b6
No known key found for this signature in database
28 changed files with 912 additions and 35 deletions

View file

@ -270,10 +270,9 @@ CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \
-D__linux__
ifneq (,$(filter $(TARGET_PRODUCT),cetus argo))
ifneq (,$(filter $(TARGET_PRODUCT),cetus))
CDEFINES += -DCONFIG_TARGET_PRODUCT_CS35L45_4X
CDEFINES += -DCONFIG_TARGET_PRODUCT_CETUS
CDEFINES += -DCONFIG_TARGET_PRODUCT_ARGO
endif
ifeq ($(TARGET_PRODUCT), venus)
@ -309,6 +308,14 @@ ifeq ($(TARGET_PRODUCT), renoir)
CDEFINES += -DQCOM_HAPTIC_BOB
endif
ifeq ($(TARGET_PRODUCT), taoyao)
CDEFINES += -DCONFIG_SND_SOC_TFA9874
CDEFINES += -DCONFIG_SND_SOC_TFA9874_DAVI_I2S
CDEFINES += -DTFA_NON_DSP_SOLUTION
CDEFINES += -DCONFIG_TARGET_PRODUCT_TAOYAO
CDEFINES += -DCONFIG_AUDIO_UART_DEBUG
endif
ifeq ($(TARGET_PRODUCT), lisa)
CDEFINES += -DCONFIG_AUDIO_UART_DEBUG
CDEFINES += -DCONFIG_SND_SOC_TFA9874
@ -323,6 +330,12 @@ ifeq ($(TARGET_PRODUCT), mona)
CDEFINES += -DCONFIG_TARGET_PRODUCT_MONA
endif
ifeq ($(TARGET_PRODUCT), redwood)
CDEFINES += -DCONFIG_AUDIO_UART_DEBUG
CDEFINES += -DCONFIG_SND_SOC_AW88263S_M20_TDM
CDEFINES += -DCONFIG_TARGET_PRODUCT_REDWOOD
endif
ifeq ($(TARGET_PRODUCT), zijin)
CDEFINES += -DCONFIG_AUDIO_UART_DEBUG
CDEFINES += -DCONFIG_SND_SOC_AW88263S_TDM

View file

@ -235,6 +235,9 @@ INCS += $(COMMON_INC) \
EXTRA_CFLAGS += $(INCS)
ifeq ($(TARGET_PRODUCT), taoyao)
CDEFINES += -DCONFIG_TARGET_PRODUCT_TAOYAO
endif
CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \
-DANI_LITTLE_BIT_ENDIAN \
@ -280,7 +283,7 @@ ifneq (,$(filter $(TARGET_PRODUCT), venus star haydn odin vili))
obj-y += cs35l41/
endif
ifneq (,$(filter $(TARGET_PRODUCT), cetus argo))
ifneq (,$(filter $(TARGET_PRODUCT), cetus))
obj-y += cs35l45/
endif
@ -288,10 +291,18 @@ ifneq (,$(filter $(TARGET_PRODUCT), renoir lisa))
obj-y += tfa98xx/
endif
ifneq (,$(filter $(TARGET_PRODUCT), taoyao))
obj-y += tfa9874/
endif
ifneq (,$(filter $(TARGET_PRODUCT), mona zijin))
obj-y += aw88263s/
endif
ifneq (,$(filter $(TARGET_PRODUCT), redwood))
obj-y += aw88263s_m20/
endif
# Module information used by KBuild framework
obj-$(CONFIG_WCD9XXX_CODEC_CORE) += wcd_core_dlkm.o
obj-$(CONFIG_WCD9XXX_CODEC_CORE_V2) += wcd_core_dlkm.o

View file

@ -124,6 +124,9 @@ CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \
ifeq ($(TARGET_PRODUCT), zijin)
CDEFINES += -DCONFIG_TARGET_PRODUCT_ZIJIN
endif
ifeq ($(TARGET_PRODUCT), taoyao)
CDEFINES += -DCONFIG_TARGET_PRODUCT_TAOYAO
endif
KBUILD_CPPFLAGS += $(CDEFINES)
@ -148,6 +151,10 @@ KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codec
KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/soc/Module.symvers
endif
ifeq ($(TARGET_PRODUCT), $(filter $(TARGET_PRODUCT),taoyao))
CDEFINES += -DCONFIG_TARGET_PRODUCT_TAOYAO
endif
# Module information used by KBuild framework
obj-$(CONFIG_SND_SOC_BOLERO) += bolero_cdc_dlkm.o
bolero_cdc_dlkm-y := $(BOLERO_OBJS)

View file

@ -45,10 +45,18 @@
#define TX_MACRO_ADC_MODE_CFG0_SHIFT 1
#define TX_MACRO_DMIC_UNMUTE_DELAY_MS 40
#if defined(CONFIG_TARGET_PRODUCT_TAOYAO)
#define TX_MACRO_AMIC_UNMUTE_DELAY_MS 100
#else
#define TX_MACRO_AMIC_UNMUTE_DELAY_MS 200
#endif
#define TX_MACRO_DMIC_HPF_DELAY_MS 200
#if defined(CONFIG_TARGET_PRODUCT_VILI) || defined(CONFIG_TARGET_PRODUCT_ZIJIN)
#define TX_MACRO_AMIC_HPF_DELAY_MS 200
#elif defined(CONFIG_TARGET_PRODUCT_TAOYAO)
#define TX_MACRO_AMIC_HPF_DELAY_MS 300
#else
#define TX_MACRO_AMIC_HPF_DELAY_MS 100
#endif
@ -644,7 +652,9 @@ static int tx_macro_put_dec_enum(struct snd_kcontrol *kcontrol,
struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
unsigned int val = 0;
u16 mic_sel_reg = 0;
#ifndef CONFIG_TARGET_PRODUCT_TAOYAO
u16 dmic_clk_reg = 0;
#endif
struct device *tx_dev = NULL;
struct tx_macro_priv *tx_priv = NULL;
@ -690,6 +700,12 @@ static int tx_macro_put_dec_enum(struct snd_kcontrol *kcontrol,
}
if (strnstr(widget->name, "SMIC", strlen(widget->name))) {
if (val != 0) {
#if defined(CONFIG_TARGET_PRODUCT_TAOYAO)
snd_soc_component_update_bits(component,
mic_sel_reg,
1 << 7, 0x0 << 7);
dev_dbg(component->dev, "%s: SMIC enter val=%d\n", __func__,val);
#else
if (val < 5) {
snd_soc_component_update_bits(component,
mic_sel_reg,
@ -708,6 +724,7 @@ static int tx_macro_put_dec_enum(struct snd_kcontrol *kcontrol,
dmic_clk_reg,
0x0E, tx_priv->dmic_clk_div << 0x1);
}
#endif
}
} else {
/* DMIC selected */

View file

@ -186,8 +186,13 @@ static int wcd_measure_adc_once(struct wcd_mbhc *mbhc, int mux_ctl)
__func__, adc_complete, adc_timeout);
ret = -EINVAL;
} else {
#ifdef CONFIG_TARGET_PRODUCT_TAOYAO
pr_debug("%s: adc complete: %d, adc timeout: %d output_mV: %d mux_ctl: %d\n",
__func__, adc_complete, adc_timeout, output_mv, mux_ctl);
#else
pr_debug("%s: adc complete: %d, adc timeout: %d output_mV: %d\n",
__func__, adc_complete, adc_timeout, output_mv);
#endif
ret = output_mv;
}
@ -857,9 +862,22 @@ correct_plug_type:
* if switch is toggled, check again,
* otherwise report unsupported plug
*/
#ifdef CONFIG_TARGET_PRODUCT_TAOYAO
if (!mbhc->mbhc_cfg->swap_gnd_mic)
{
pr_err("%s: mbhc->mbhc_cfg->swap_gnd_mic is NULL\n", __func__);
}
#endif
if (mbhc->mbhc_cfg->swap_gnd_mic &&
#ifdef CONFIG_TARGET_PRODUCT_TAOYAO
!(mbhc->mbhc_cfg->swap_gnd_mic(component,
true))) {
#else
mbhc->mbhc_cfg->swap_gnd_mic(component,
true)) {
#endif
pr_debug("%s: US_EU gpio present,flip switch\n"
, __func__);
continue;
@ -948,6 +966,13 @@ report:
WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_MODE, 0);
WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_EN, 0);
if (mbhc->hs_detect_work_stop) {
pr_debug("%s: stop requested: %d\n", __func__,
mbhc->hs_detect_work_stop);
wcd_micbias_disable(mbhc);
goto exit;
}
WCD_MBHC_RSC_LOCK(mbhc);
wcd_mbhc_find_plug_and_report(mbhc, plug_type);
WCD_MBHC_RSC_UNLOCK(mbhc);

View file

@ -410,6 +410,14 @@ out_micb_en:
break;
/* MICBIAS usage change */
case WCD_EVENT_POST_DAPM_MICBIAS_2_OFF:
#ifdef CONFIG_TARGET_PRODUCT_TAOYAO
if (mbhc->mbhc_cfg->enable_usbc_analog &&
(mbhc->is_hs_recording == true)) {
WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 0);
if (mbhc->mbhc_cb->clk_setup)
mbhc->mbhc_cb->clk_setup(mbhc->component, false);
}
#endif
mbhc->is_hs_recording = false;
pr_debug("%s: is_capture: %d\n", __func__,
mbhc->is_hs_recording);
@ -1113,7 +1121,6 @@ static void wcd_mbhc_swch_irq_handler(struct wcd_mbhc *mbhc)
if ((mbhc->current_plug == MBHC_PLUG_TYPE_NONE) &&
detection_type) {
/* If moisture is present, then enable polling, disable
* moisture detection and wait for interrupt
*/
@ -1150,6 +1157,10 @@ static void wcd_mbhc_swch_irq_handler(struct wcd_mbhc *mbhc)
mbhc->mbhc_fn->wcd_mbhc_detect_plug_type(mbhc);
} else if ((mbhc->current_plug != MBHC_PLUG_TYPE_NONE)
&& !detection_type) {
#if defined(CONFIG_TARGET_PRODUCT_TAOYAO)
if (mbhc->mbhc_cb->mbhc_micbias_control)
mbhc->mbhc_cb->mbhc_micbias_control(component, MIC_BIAS_2,MICB2_DISABLE);
#endif
/* Disable external voltage source to micbias if present */
if (mbhc->mbhc_cb->enable_mb_source)
mbhc->mbhc_cb->enable_mb_source(mbhc, false);
@ -1205,8 +1216,12 @@ static void wcd_mbhc_swch_irq_handler(struct wcd_mbhc *mbhc)
WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_SCHMT_ISRC, 0);
mbhc->extn_cable_hph_rem = false;
wcd_mbhc_report_plug(mbhc, 0, jack_type);
if (mbhc->mbhc_cfg->enable_usbc_analog) {
#ifdef CONFIG_TARGET_PRODUCT_TAOYAO
if (mbhc->mbhc_cfg->enable_usbc_analog &&
(mbhc->is_hs_recording == false)) {
#else
if (mbhc->mbhc_cfg->enable_usbc_analog) {
#endif
WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 0);
if (mbhc->mbhc_cb->clk_setup)
mbhc->mbhc_cb->clk_setup(

View file

@ -69,6 +69,10 @@ COMMON_INC := -I$(AUDIO_ROOT)/$(COMMON_DIR)
############ WCD937X ############
ifeq ($(TARGET_PRODUCT), taoyao)
CDEFINES += -DCONFIG_SND_SOC_FOR_ULTRASOUND_PATH
endif
# for WCD937X Codec
ifdef CONFIG_SND_SOC_WCD937X
WCD937X_OBJS += wcd937x.o

View file

@ -1117,10 +1117,6 @@ int wcd937x_mbhc_init(struct wcd937x_mbhc **mbhc,
}
(*mbhc) = wcd937x_mbhc;
snd_soc_add_component_controls(component, impedance_detect_controls,
ARRAY_SIZE(impedance_detect_controls));
snd_soc_add_component_controls(component, hph_type_detect_controls,
ARRAY_SIZE(hph_type_detect_controls));
return 0;
err:

View file

@ -198,10 +198,12 @@ static int wcd937x_init_reg(struct snd_soc_component *component)
snd_soc_component_update_bits(component, WCD937X_MICB3_TEST_CTL_2,
0x38, 0x00);
/* Set Bandgap Fine Adjustment to +5mV for Tanggu SMIC part */
dev_err(component->dev, "%s enter\n",__func__);
if (snd_soc_component_read32(component, WCD937X_DIGITAL_EFUSE_REG_16)
== 0x01) {
snd_soc_component_update_bits(component,
WCD937X_BIAS_VBG_FINE_ADJ, 0xF0, 0xB0);
dev_err(component->dev, "%s wcd937x is smic\n",__func__);
} else if (snd_soc_component_read32(component,
WCD937X_DIGITAL_EFUSE_REG_16) == 0x02) {
snd_soc_component_update_bits(component,
@ -1710,6 +1712,33 @@ int wcd937x_micbias_control(struct snd_soc_component *component,
&wcd937x->mbhc->notifier, post_dapm_off,
&wcd937x->mbhc->wcd_mbhc);
break;
case MICB2_DISABLE:
if (wcd937x->micb_ref[micb_index] > 0)
wcd937x->micb_ref[micb_index]--;
if ((wcd937x->micb_ref[micb_index] == 0) &&
(wcd937x->pullup_ref[micb_index] > 0))
snd_soc_component_update_bits(component, micb_reg,
0xC0, 0x80);
else if ((wcd937x->micb_ref[micb_index] == 0) &&
(wcd937x->pullup_ref[micb_index] == 0)) {
if (pre_off_event && wcd937x->mbhc)
blocking_notifier_call_chain(
&wcd937x->mbhc->notifier, pre_off_event,
&wcd937x->mbhc->wcd_mbhc);
snd_soc_component_update_bits(component, micb_reg,
0xC0, 0x00);
if (post_off_event && wcd937x->mbhc)
blocking_notifier_call_chain(
&wcd937x->mbhc->notifier,
post_off_event,
&wcd937x->mbhc->wcd_mbhc);
}
if (is_dapm && post_dapm_off && wcd937x->mbhc)
blocking_notifier_call_chain(
&wcd937x->mbhc->notifier, post_dapm_off,
&wcd937x->mbhc->wcd_mbhc);
break;
};
dev_dbg(component->dev, "%s: micb_num:%d, micb_ref: %d, pullup_ref: %d\n",

View file

@ -26,6 +26,7 @@
#include "wcd938x.h"
#include "internal.h"
#include "asoc/bolero-slave-internal.h"
#include "linux/mmhardware_sysfs.h"
#define NUM_SWRS_DT_PARAMS 5
#define WCD938X_VARIANT_ENTRY_SIZE 32
@ -4311,6 +4312,10 @@ static int wcd938x_bind(struct device *dev)
}
wcd938x->dev_up = true;
/* register codec hardware */
#ifdef CONFIG_MMHARDWARE_DETECTION
register_kobj_under_mmsysfs(MM_HW_CODEC, MM_HARDWARE_SYSFS_CODEC_FOLDER);
#endif
return ret;
err_irq:
wcd_irq_exit(&wcd938x->irq_info, wcd938x->virq);

View file

@ -107,11 +107,19 @@ static struct port_params tx_frame_params_shima_0p6MHz[SWR_MSTR_PORT_LEN] = {
{1, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0x00, 0x00}, /* TX3 */
};
#ifdef CONFIG_TARGET_PRODUCT_TAOYAO
static struct port_params tx_frame_params_wcd937x[SWR_MSTR_PORT_LEN] = {
{3, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0x00, 0x00}, /* TX1 */
{3, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 1, 0x00, 0x00}, /* TX2 */
{3, 2, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0x00, 0x00}, /* TX3 */
};
#else
static struct port_params tx_frame_params_wcd937x[SWR_MSTR_PORT_LEN] = {
{3, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 1, 0x00, 0x00}, /* TX1 */
{3, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0x00, 0x00}, /* TX2 */
{3, 2, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0x00, 0x00}, /* TX3 */
};
#endif
static struct swr_mstr_port_map sm_port_map[] = {
{TX_MACRO, SWR_UC0, tx_frame_params_default},

View file

@ -107,8 +107,11 @@ enum {
TDM_7,
TDM_PORT_MAX,
};
#if defined(CONFIG_TARGET_PRODUCT_REDWOOD)
#define TDM_MAX_SLOTS 4
#else
#define TDM_MAX_SLOTS 8
#endif
#define TDM_SLOT_WIDTH_BITS 32
#define TDM_SLOT_WIDTH_BYTES TDM_SLOT_WIDTH_BITS/8
@ -546,6 +549,30 @@ static struct dev_config mi2s_tx_cfg[] = {
[SEN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
};
#if defined(CONFIG_TARGET_PRODUCT_REDWOOD)
static struct tdm_dev_config pri_tdm_dev_config[MAX_PATH][TDM_PORT_MAX] = {
{ /* PRI TDM */
{ {0, 4, 0xFFFF} }, /* RX_0 */
{ {0xFFFF} }, /* RX_1 */
{ {0xFFFF} }, /* RX_2 */
{ {0xFFFF} }, /* RX_3 */
{ {0xFFFF} }, /* RX_4 */
{ {0xFFFF} }, /* RX_5 */
{ {0xFFFF} }, /* RX_6 */
{ {0xFFFF} }, /* RX_7 */
},
{
{ {0, 4, 0xFFFF} }, /* TX_0 */
{ {0xFFFF} }, /* TX_1 */
{ {0xFFFF} }, /* TX_2 */
{ {0xFFFF} }, /* TX_3 */
{ {0xFFFF} }, /* TX_4 */
{ {0xFFFF} }, /* TX_5 */
{ {0xFFFF} }, /* TX_6 */
{ {0xFFFF} }, /* TX_7 */
},
};
#else
static struct tdm_dev_config pri_tdm_dev_config[MAX_PATH][TDM_PORT_MAX] = {
{ /* PRI TDM */
{ {0, 4, 0xFFFF} }, /* RX_0 */
@ -580,6 +607,7 @@ static struct tdm_dev_config pri_tdm_dev_config[MAX_PATH][TDM_PORT_MAX] = {
{ {0xFFFF} }, /* TX_7 */
},
};
#endif
static struct tdm_dev_config sec_tdm_dev_config[MAX_PATH][TDM_PORT_MAX] = {
{ /* SEC TDM */
@ -604,6 +632,30 @@ static struct tdm_dev_config sec_tdm_dev_config[MAX_PATH][TDM_PORT_MAX] = {
},
};
#if defined(CONFIG_TARGET_PRODUCT_REDWOOD)
static struct tdm_dev_config tert_tdm_dev_config[MAX_PATH][TDM_PORT_MAX] = {
{ /* TERT TDM */
{ {0, 4, 0xFFFF} }, /* RX_0 */
{ {16, 20, 0xFFFF} }, /* RX_1 */
{ {16, 20, 0xFFFF} }, /* RX_2 */
{ {24, 28, 0xFFFF} }, /* RX_3 */
{ {0xFFFF} }, /* RX_4 */
{ {0xFFFF} }, /* RX_5 */
{ {0xFFFF} }, /* RX_6 */
{ {0xFFFF} }, /* RX_7 */
},
{
{ {0, 4, 0xFFFF} }, /* TX_0 */
{ {8, 12, 0xFFFF} }, /* TX_1 */
{ {16, 20, 0xFFFF} }, /* TX_2 */
{ {24, 28, 0xFFFF} }, /* TX_3 */
{ {0xFFFF} }, /* TX_4 */
{ {0xFFFF} }, /* TX_5 */
{ {0xFFFF} }, /* TX_6 */
{ {0xFFFF} }, /* TX_7 */
},
};
#else
static struct tdm_dev_config tert_tdm_dev_config[MAX_PATH][TDM_PORT_MAX] = {
{ /* TERT TDM */
{ {0, 4, 8, 12, 0xFFFF} }, /* RX_0 */
@ -626,6 +678,7 @@ static struct tdm_dev_config tert_tdm_dev_config[MAX_PATH][TDM_PORT_MAX] = {
{ {0xFFFF} }, /* TX_7 */
},
};
#endif
static struct tdm_dev_config quat_tdm_dev_config[MAX_PATH][TDM_PORT_MAX] = {
{ /* QUAT TDM */
@ -4231,9 +4284,12 @@ static const struct snd_kcontrol_new msm_common_snd_controls[] = {
SOC_ENUM_EXT("PRI_TDM_RX_0 SampleRate", tdm_rx_sample_rate,
tdm_rx_sample_rate_get,
tdm_rx_sample_rate_put),
#if defined(CONFIG_TARGET_PRODUCT_REDWOOD)
#else
SOC_ENUM_EXT("PRI_TDM_RX_1 SampleRate", tdm_rx_sample_rate,
tdm_rx_sample_rate_get,
tdm_rx_sample_rate_put),
#endif
SOC_ENUM_EXT("SEC_TDM_RX_0 SampleRate", tdm_rx_sample_rate,
tdm_rx_sample_rate_get,
tdm_rx_sample_rate_put),
@ -4349,9 +4405,12 @@ static const struct snd_kcontrol_new msm_common_snd_controls[] = {
SOC_ENUM_EXT("PRI_TDM_RX_0 Format", tdm_rx_format,
tdm_rx_format_get,
tdm_rx_format_put),
#if defined(CONFIG_TARGET_PRODUCT_REDWOOD)
#else
SOC_ENUM_EXT("PRI_TDM_RX_1 Format", tdm_rx_format,
tdm_rx_format_get,
tdm_rx_format_put),
#endif
SOC_ENUM_EXT("SEC_TDM_RX_0 Format", tdm_rx_format,
tdm_rx_format_get,
tdm_rx_format_put),
@ -4445,9 +4504,12 @@ static const struct snd_kcontrol_new msm_common_snd_controls[] = {
SOC_ENUM_EXT("PRI_TDM_RX_0 Channels", tdm_rx_chs,
tdm_rx_ch_get,
tdm_rx_ch_put),
#if defined(CONFIG_TARGET_PRODUCT_REDWOOD)
#else
SOC_ENUM_EXT("PRI_TDM_RX_1 Channels", tdm_rx_chs,
tdm_rx_ch_get,
tdm_rx_ch_put),
#endif
SOC_ENUM_EXT("SEC_TDM_RX_0 Channels", tdm_rx_chs,
tdm_rx_ch_get,
tdm_rx_ch_put),
@ -4707,6 +4769,8 @@ static int msm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
rate->min = rate->max = tdm_rx_cfg[TDM_PRI][TDM_0].sample_rate;
break;
#if defined(CONFIG_TARGET_PRODUCT_REDWOOD)
#else
case MSM_BACKEND_DAI_PRI_TDM_RX_1:
channels->min = channels->max =
tdm_rx_cfg[TDM_PRI][TDM_1].channels;
@ -4714,6 +4778,7 @@ static int msm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
tdm_rx_cfg[TDM_PRI][TDM_1].bit_format);
rate->min = rate->max = tdm_rx_cfg[TDM_PRI][TDM_1].sample_rate;
break;
#endif
case MSM_BACKEND_DAI_PRI_TDM_TX_0:
channels->min = channels->max =
@ -5167,7 +5232,7 @@ static int lahaina_tdm_snd_hw_params(struct snd_pcm_substream *substream,
__func__, cpu_dai->id);
return -EINVAL;
}
#if defined(CONFIG_TARGET_PRODUCT_LISA) || defined(CONFIG_TARGET_PRODUCT_MONA) || defined(CONFIG_TARGET_PRODUCT_ZIJIN)
#if defined(CONFIG_TARGET_PRODUCT_LISA) || defined(CONFIG_TARGET_PRODUCT_MONA) || defined(CONFIG_TARGET_PRODUCT_ZIJIN) || defined(CONFIG_TARGET_PRODUCT_REDWOOD)
if (slots == TDM_MAX_SLOTS) {
slots = TDM_MAX_SLOTS / 2;
pr_debug("%s: dai id = 0x%x update slots = %d\n", __func__, cpu_dai->id, slots);
@ -5278,7 +5343,10 @@ static int msm_get_tdm_mode(u32 port_id)
switch (port_id) {
case AFE_PORT_ID_PRIMARY_TDM_RX:
#if defined(CONFIG_TARGET_PRODUCT_REDWOOD)
#else
case AFE_PORT_ID_PRIMARY_TDM_RX_1:
#endif
case AFE_PORT_ID_PRIMARY_TDM_TX:
tdm_mode = TDM_PRI;
break;
@ -6584,7 +6652,7 @@ static struct snd_soc_dai_link msm_common_dai_links[] = {
.ignore_suspend = 1,
SND_SOC_DAILINK_REG(tx3_cdcdma_hostless),
},
#if defined(CONFIG_TARGET_PRODUCT_LISA) || defined(CONFIG_TARGET_PRODUCT_MONA) || defined(CONFIG_TARGET_PRODUCT_ZIJIN)
#if defined(CONFIG_TARGET_PRODUCT_LISA) || defined(CONFIG_TARGET_PRODUCT_MONA) || defined(CONFIG_TARGET_PRODUCT_ZIJIN) || defined(CONFIG_TARGET_PRODUCT_REDWOOD)
{/* hw:x,32 */
.name = "PRI_TDM_TX_0_HOSTLESS",
.stream_name = "PRI_TDM_TX_0_HOSTLESS Capture",
@ -6611,6 +6679,20 @@ static struct snd_soc_dai_link msm_common_dai_links[] = {
SND_SOC_DAILINK_REG(tert_mi2s_tx_hostless),
},
#endif
#if defined(CONFIG_TARGET_PRODUCT_TAOYAO)
{/* hw:x,32 */
.name = "Primary MI2S TX_Hostless",
.stream_name = "Primary MI2S_TX Hostless Capture",
.dynamic = 1,
.dpcm_capture = 1,
.trigger = {SND_SOC_DPCM_TRIGGER_POST,
SND_SOC_DPCM_TRIGGER_POST},
.no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
.ignore_suspend = 1,
.ignore_pmdown_time = 1,
SND_SOC_DAILINK_REG(pri_mi2s_tx_hostless),
},
#endif
};
static struct snd_soc_dai_link msm_bolero_fe_dai_links[] = {
@ -6949,7 +7031,7 @@ static struct snd_soc_dai_link msm_common_be_dai_links[] = {
.ignore_pmdown_time = 1,
SND_SOC_DAILINK_REG(pri_tdm_rx_0),
},
#if defined(CONFIG_TARGET_PRODUCT_LISA) || defined(CONFIG_TARGET_PRODUCT_MONA) || defined(CONFIG_TARGET_PRODUCT_ZIJIN)
#if defined(CONFIG_TARGET_PRODUCT_LISA) || defined(CONFIG_TARGET_PRODUCT_MONA) || defined(CONFIG_TARGET_PRODUCT_ZIJIN) || defined(CONFIG_TARGET_PRODUCT_REDWOOD)
{
.name = LPASS_BE_PRI_TDM_RX_1,
.stream_name = "Primary TDM1 Playback",
@ -7009,7 +7091,7 @@ static struct snd_soc_dai_link msm_common_be_dai_links[] = {
.ignore_pmdown_time = 1,
SND_SOC_DAILINK_REG(tert_tdm_rx_0),
},
#if defined(CONFIG_SND_SOC_TFA9874) || defined(CONFIG_SND_SOC_AW88263S_TDM)
#if defined(CONFIG_SND_SOC_TFA9874) || defined(CONFIG_SND_SOC_AW88263S_TDM) || defined(CONFIG_SND_SOC_AW88263S_M20_TDM)
#else
{
.name = LPASS_BE_TERT_TDM_RX_1,
@ -9274,8 +9356,16 @@ static int msm_asoc_machine_probe(struct platform_device *pdev)
wcd_mbhc_cfg.swap_gnd_mic = msm_swap_gnd_mic;
}
#ifdef CONFIG_TARGET_PRODUCT_TAOYAO
if (wcd_mbhc_cfg.enable_usbc_analog)
{
pr_err("%s: Set swap_gnd_mic = msm_usbc_swap_gnd_mic \n");
wcd_mbhc_cfg.swap_gnd_mic = msm_usbc_swap_gnd_mic;
}
#else
if (wcd_mbhc_cfg.enable_usbc_analog)
wcd_mbhc_cfg.swap_gnd_mic = msm_usbc_swap_gnd_mic;
#endif
pdata->fsa_handle = of_parse_phandle(pdev->dev.of_node,
"fsa4480-i2c-handle", 0);

View file

@ -573,12 +573,14 @@ static struct snd_soc_dai_driver msm_fe_dais[] = {
{
.playback = {
.stream_name = "ULTRAOUND_HOSTLESS Playback",
#if defined (CONFIG_TARGET_PRODUCT_CETUS) || defined(CONFIG_TARGET_PRODUCT_ARGO)
#if defined (CONFIG_TARGET_PRODUCT_CETUS)
.aif_name = "RX1_CDC_DMA_DL_US",
#elif defined (CONFIG_TARGET_PRODUCT_RENOIR)
.aif_name = "TERT_MI2S_DL_HL",
#elif defined(CONFIG_TARGET_PRODUCT_LISA) || defined(CONFIG_TARGET_PRODUCT_MONA) || defined(CONFIG_TARGET_PRODUCT_ZIJIN)
.aif_name = "PRI_TDM_RX_1_DL_US",
#elif defined(CONFIG_TARGET_PRODUCT_TAOYAO)
.aif_name = "PRI_MI2S_DL_HL",
#else
.aif_name = "TERT_TDM_RX_1_DL_US",
#endif

View file

@ -22,7 +22,10 @@
#include "msm-dai-q6-v2.h"
#include <asoc/core.h>
#ifdef TFA_NON_DSP_SOLUTION
#if defined(CONFIG_TARGET_PRODUCT_TAOYAO)
#include "codecs/tfa9874/inc/tfa_platform_interface_definition.h"
#endif
#endif
#define MSM_DAI_PRI_AUXPCM_DT_DEV_ID 1
@ -6161,6 +6164,7 @@ static int msm_dai_q6_mi2s_hw_params(struct snd_pcm_substream *substream,
struct msm_dai_q6_dai_data *dai_data = &mi2s_dai_config->mi2s_dai_data;
struct afe_param_id_i2s_cfg *i2s = &dai_data->port_config.i2s;
#ifdef TFA_NON_DSP_SOLUTION
#if defined(CONFIG_TARGET_PRODUCT_TAOYAO)
u16 port_id = 0;
if (msm_mi2s_get_port_id(dai->id, substream->stream,
@ -6169,6 +6173,7 @@ static int msm_dai_q6_mi2s_hw_params(struct snd_pcm_substream *substream,
__func__, port_id);
return -EINVAL;
}
#endif
#endif
dai_data->channels = params_channels(params);
switch (dai_data->channels) {
@ -6351,7 +6356,6 @@ static int msm_dai_q6_mi2s_hw_params(struct snd_pcm_substream *substream,
dai_data->port_config.i2s.i2s_cfg_minor_version =
AFE_API_VERSION_I2S_CONFIG;
dai_data->port_config.i2s.sample_rate = dai_data->rate;
dev_dbg(dai->dev, "%s: dai id %d dai_data->channels = %d\n"
"sample_rate = %u i2s_cfg_minor_version = 0x%x\n"
"bit_width = %hu channel_mode = 0x%x mono_stereo = %#x\n"

View file

@ -89,8 +89,12 @@
#define DRV_NAME "msm-pcm-routing-v2"
#ifdef CONFIG_SND_SOC_TFA9874
#if defined(CONFIG_TARGET_PRODUCT_TAOYAO)
#include "codecs/tfa9874/inc/tfa_platform_interface_definition.h"
#else
#include "codecs/tfa98xx/inc/tfa_platform_interface_definition.h"
#endif
#endif
#if defined(CONFIG_SND_SOC_AW88263S_TDM)
#define PLATFORM_TDM_RX_VI_FB_RX_MUX_TEXT "PRI_TDM_RX_0"
@ -100,6 +104,14 @@
#define PLATFORM_TDM_RX_VI_FB_MUX_ENUM MSM_BACKEND_DAI_PRI_TDM_RX_0
#endif
#if defined(CONFIG_SND_SOC_AW88263S_M20_TDM)
#define PLATFORM_TDM_RX_VI_FB_RX_MUX_TEXT "PRI_TDM_RX_0"
#define PLATFORM_TDM_RX_VI_FB_TX_MUX_TEXT "PRI_TDM_TX_0"
#define PLATFORM_TDM_RX_VI_FB_MUX_NAME "PRI_TDM_RX_VI_FB_MUX"
#define PLATFORM_TDM_RX_VI_FB_TX_VALUE MSM_BACKEND_DAI_PRI_TDM_TX_0
#define PLATFORM_TDM_RX_VI_FB_MUX_ENUM MSM_BACKEND_DAI_PRI_TDM_RX_0
#endif
#ifndef CONFIG_DOLBY_DAP
#undef DOLBY_ADM_COPP_TOPOLOGY_ID
#define DOLBY_ADM_COPP_TOPOLOGY_ID 0xFFFFFFFE
@ -33379,6 +33391,12 @@ static const char * const tdm_rx_vi_fb_tx_mux_text[] = {
};
#endif
#if defined(CONFIG_SND_SOC_AW88263S_M20_TDM)
static const char * const tdm_rx_vi_fb_tx_mux_text[] = {
"ZERO", PLATFORM_TDM_RX_VI_FB_TX_MUX_TEXT
};
#endif
static const char * const int4_mi2s_rx_vi_fb_tx_mono_mux_text[] = {
"ZERO", "INT5_MI2S_TX"
};
@ -33426,6 +33444,12 @@ static const int tdm_rx_vi_fb_tx_value[] = {
};
#endif
#if defined(CONFIG_SND_SOC_AW88263S_M20_TDM)
static const int tdm_rx_vi_fb_tx_value[] = {
MSM_BACKEND_DAI_MAX, PLATFORM_TDM_RX_VI_FB_TX_VALUE
};
#endif
static const int int4_mi2s_rx_vi_fb_tx_mono_ch_value[] = {
MSM_BACKEND_DAI_MAX, MSM_BACKEND_DAI_INT5_MI2S_TX
};
@ -33480,6 +33504,13 @@ static const struct soc_enum tdm_rx_vi_fb_mux_enum =
tdm_rx_vi_fb_tx_mux_text, tdm_rx_vi_fb_tx_value);
#endif
#if defined(CONFIG_SND_SOC_AW88263S_M20_TDM)
static const struct soc_enum tdm_rx_vi_fb_mux_enum =
SOC_VALUE_ENUM_DOUBLE(0, PLATFORM_TDM_RX_VI_FB_MUX_ENUM, 0, 0,
ARRAY_SIZE(tdm_rx_vi_fb_tx_mux_text),
tdm_rx_vi_fb_tx_mux_text, tdm_rx_vi_fb_tx_value);
#endif
static const struct soc_enum int4_mi2s_rx_vi_fb_mono_ch_mux_enum =
SOC_VALUE_ENUM_DOUBLE(SND_SOC_NOPM, MSM_BACKEND_DAI_INT4_MI2S_RX, 0, 0,
ARRAY_SIZE(int4_mi2s_rx_vi_fb_tx_mono_mux_text),
@ -33538,6 +33569,13 @@ static const struct snd_kcontrol_new tdm_rx_vi_fb_mux =
spkr_prot_put_vi_lch_port);
#endif
#if defined(CONFIG_SND_SOC_AW88263S_M20_TDM)
static const struct snd_kcontrol_new tdm_rx_vi_fb_mux =
SOC_DAPM_ENUM_EXT(PLATFORM_TDM_RX_VI_FB_MUX_NAME,
tdm_rx_vi_fb_mux_enum, spkr_prot_get_vi_lch_port,
spkr_prot_put_vi_lch_port);
#endif
static const struct snd_kcontrol_new int4_mi2s_rx_vi_fb_mono_ch_mux =
SOC_DAPM_ENUM_EXT("INT4_MI2S_RX_VI_FB_MONO_CH_MUX",
int4_mi2s_rx_vi_fb_mono_ch_mux_enum, spkr_prot_get_vi_lch_port,
@ -33631,7 +33669,7 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
"TX4_CDC_DMA_HOSTLESS Capture", 0, 0, 0, 0),
SND_SOC_DAPM_AIF_OUT("TX4_CDC_DMA_UL_US", "ULTRAOUND_HOSTLESS Capture",
0, 0, 0, 0),
#if defined(CONFIG_TARGET_PRODUCT_CETUS) || defined(CONFIG_TARGET_PRODUCT_ARGO)
#if defined(CONFIG_TARGET_PRODUCT_CETUS)
SND_SOC_DAPM_AIF_IN("RX1_CDC_DMA_DL_US", "ULTRAOUND_HOSTLESS Playback",
0, 0, 0, 0),
#elif defined(CONFIG_TARGET_PRODUCT_LISA) || defined(CONFIG_TARGET_PRODUCT_MONA) || defined(CONFIG_TARGET_PRODUCT_ZIJIN)
@ -35687,6 +35725,11 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets_tdm[] = {
SND_SOC_DAPM_MUX(PLATFORM_TDM_RX_VI_FB_MUX_NAME, SND_SOC_NOPM, 0, 0,
&tdm_rx_vi_fb_mux),
#endif
#if defined(CONFIG_SND_SOC_AW88263S_M20_TDM)
SND_SOC_DAPM_MUX(PLATFORM_TDM_RX_VI_FB_MUX_NAME, SND_SOC_NOPM, 0, 0,
&tdm_rx_vi_fb_mux),
#endif
#ifndef CONFIG_HSIF_DISABLE
SND_SOC_DAPM_MIXER("HSIF0_TDM_RX_0 Port Mixer", SND_SOC_NOPM, 0, 0,
hsif0_tdm_rx_0_port_mixer_controls,
@ -41476,6 +41519,10 @@ static const struct snd_soc_dapm_route intercon_tdm[] = {
{PLATFORM_TDM_RX_VI_FB_RX_MUX_TEXT, NULL, PLATFORM_TDM_RX_VI_FB_MUX_NAME},
#endif
#if defined(CONFIG_SND_SOC_AW88263S_M20_TDM)
{PLATFORM_TDM_RX_VI_FB_MUX_NAME, PLATFORM_TDM_RX_VI_FB_TX_MUX_TEXT, PLATFORM_TDM_RX_VI_FB_TX_MUX_TEXT},
{PLATFORM_TDM_RX_VI_FB_RX_MUX_TEXT, NULL, PLATFORM_TDM_RX_VI_FB_MUX_NAME},
#endif
#ifndef CONFIG_HSIF_DISABLE
{"HSIF0_TDM_TX_0", NULL, "BE_IN"},
{"HSIF0_TDM_TX_1", NULL, "BE_IN"},
@ -42107,7 +42154,9 @@ static const struct snd_soc_dapm_route intercon_mi2s[] = {
{"PRI_MI2S_UL_HL", NULL, "PRI_MI2S_TX"},
{"SEC_MI2S_UL_HL", NULL, "SEC_MI2S_TX"},
{"SEC_MI2S_RX", NULL, "SEC_MI2S_DL_HL"},
#if !defined(CONFIG_TARGET_PRODUCT_TAOYAO)
{"PRI_MI2S_RX", NULL, "PRI_MI2S_DL_HL"},
#endif
#if !defined(CONFIG_TARGET_PRODUCT_RENOIR)
{"TERT_MI2S_RX", NULL, "TERT_MI2S_DL_HL"},
#endif

View file

@ -452,6 +452,12 @@ SND_SOC_DAILINK_DEFS(pri_tdm_rx_0,
COMP_CODEC("tfa98xx.1-0035", "tfa98xx-aif-1-35")),
DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-routing")));
#elif defined(CONFIG_SND_SOC_AW88263S_TDM)
SND_SOC_DAILINK_DEFS(pri_tdm_rx_0,
DAILINK_COMP_ARRAY(COMP_CPU("msm-dai-q6-tdm.36864")),
DAILINK_COMP_ARRAY(COMP_CODEC("aw882xx_smartpa.1-0034", "aw882xx-aif-1-34"),
COMP_CODEC("aw882xx_smartpa.1-0035", "aw882xx-aif-1-35")),
DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-routing")));
#elif defined(CONFIG_SND_SOC_AW88263S_M20_TDM)
SND_SOC_DAILINK_DEFS(pri_tdm_rx_0,
DAILINK_COMP_ARRAY(COMP_CPU("msm-dai-q6-tdm.36864")),
DAILINK_COMP_ARRAY(COMP_CODEC("aw882xx_smartpa.1-0034", "aw882xx-aif-1-34"),
@ -1021,11 +1027,19 @@ SND_SOC_DAILINK_DEFS(display_port1,
DAILINK_COMP_ARRAY(COMP_CODEC("msm-ext-disp-audio-codec-rx",
"msm_dp_audio_codec_rx1_dai")),
DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-routing")));
#if defined(CONFIG_TARGET_PRODUCT_TAOYAO)
SND_SOC_DAILINK_DEFS(pri_mi2s_rx,
DAILINK_COMP_ARRAY(COMP_CPU("msm-dai-q6-mi2s.0")),
DAILINK_COMP_ARRAY(COMP_CODEC("tfa98xx.1-0034", "tfa98xx-aif-1-34"),
COMP_CODEC("tfa98xx.1-0035", "tfa98xx-aif-1-35")),
DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-routing")));
#else
SND_SOC_DAILINK_DEFS(pri_mi2s_rx,
DAILINK_COMP_ARRAY(COMP_CPU("msm-dai-q6-mi2s.0")),
DAILINK_COMP_ARRAY(COMP_CODEC("msm-stub-codec.1", "msm-stub-rx")),
DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-routing")));
#endif
SND_SOC_DAILINK_DEFS(pri_mi2s_tx,
DAILINK_COMP_ARRAY(COMP_CPU("msm-dai-q6-mi2s.1")),

View file

@ -46,3 +46,5 @@ export CONFIG_SND_SOC_TFA9874=m
export CONFIG_AUXPCM_DISABLE=m
export CONFIG_MIUS_IIO=m
export CONFIG_SND_SOC_AW88263S=m
export CONFIG_SND_SOC_AW88263S_M20=m
export CONFIG_MMHARDWARE_DETECTION=m

View file

@ -52,3 +52,5 @@
#define CONFIG_SWRM_VER_1P6 1
#define CONFIG_MIUS_IIO 1
#define CONFIG_SND_SOC_AW88263S 1
#define CONFIG_SND_SOC_AW88263S_M20 1
#define CONFIG_MMHARDWARE_DETECTION 1

View file

@ -249,6 +249,10 @@ ifdef CONFIG_DIGITAL_CDC_RSC_MGR
Q6_OBJS += digital-cdc-rsc-mgr.o
endif
ifdef CONFIG_MMHARDWARE_DETECTION
MMHARDWARE_SYSFS += mmhardware_sysfs.o
endif
LINUX_INC += -Iinclude/linux
INCS += $(COMMON_INC) \
@ -268,15 +272,18 @@ ifneq (,$(filter $(TARGET_PRODUCT),vili))
CDEFINES += -DCONFIG_TARGET_PRODUCT_VILI
endif
ifneq (,$(filter $(TARGET_PRODUCT),argo))
CDEFINES += -DCONFIG_TARGET_PRODUCT_ARGO
endif
ifeq ($(TARGET_PRODUCT), renoir)
CDEFINES += -DCONFIG_SND_SOC_TFA9874_FOR_DAVI
CDEFINES += -DTFA_NON_DSP_SOLUTION
endif
ifeq ($(TARGET_PRODUCT), taoyao)
CDEFINES += -DCONFIG_SND_SOC_TFA9874_FOR_DAVI
CDEFINES += -DTFA_NON_DSP_SOLUTION
CDEFINES += -DCONFIG_TARGET_PRODUCT_TAOYAO
endif
ifeq ($(TARGET_PRODUCT), lisa)
CDEFINES += -DCONFIG_SND_SOC_TFA9874_FOR_DAVI
CDEFINES += -DTFA_NON_DSP_SOLUTION
@ -293,6 +300,11 @@ ifeq ($(TARGET_PRODUCT), zijin)
CDEFINES += -DCONFIG_TARGET_PRODUCT_ZIJIN
endif
ifeq ($(TARGET_PRODUCT), redwood)
CDEFINES += -DCONFIG_SND_SOC_AW88263S_M20_TDM
CDEFINES += -DCONFIG_TARGET_PRODUCT_REDWOOD
endif
CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \
-DANI_LITTLE_BIT_ENDIAN \
-DDOT11F_LITTLE_ENDIAN_HOST \
@ -307,7 +319,11 @@ CDEFINES += -DANI_LITTLE_BYTE_ENDIAN \
ifneq (,$(filter $(TARGET_PRODUCT), star))
CDEFINES += -DAUDIO_FORCE_RESTART_ADSP
endif
# CDEFINES += -DAUDIO_FORCE_RESTART_ADSP
ifeq ($(TARGET_PRODUCT), $(filter $(TARGET_PRODUCT), zijin taoyao))
CDEFINES += -DAUDIO_FORCE_RESTART_ADSP_TEMP
endif
KBUILD_CPPFLAGS += $(CDEFINES)
@ -360,3 +376,6 @@ q6_pdr_dlkm-y := $(QDSP6_PDR_OBJS)
obj-$(CONFIG_MSM_QDSP6_NOTIFIER) += q6_notifier_dlkm.o
q6_notifier_dlkm-y := $(QDSP6_NOTIFIER_OBJS)
obj-$(CONFIG_MMHARDWARE_DETECTION) += mmhardware_sysfs_dlkm.o
mmhardware_sysfs_dlkm-y := $(MMHARDWARE_SYSFS)

View file

@ -8,6 +8,10 @@
#include <linux/debugfs.h>
#include <dsp/apr_audio-v2.h>
#ifdef AUDIO_FORCE_RESTART_ADSP_TEMP
#include <soc/qcom/subsystem_restart.h>
#include <linux/version.h>
#endif
/* ERROR STRING */
/* Success. The operation completed with no errors. */
@ -125,9 +129,57 @@ static inline void adsp_err_check_panic(u32 adsp_error)
static inline void adsp_err_check_panic(u32 adsp_error) {}
#endif
#ifdef AUDIO_FORCE_RESTART_ADSP_TEMP
#define ADSP_ERR_LIMITED_COUNT (15)
#define ADSP_ERR_LIMITED_TIME (1)
static int err_count = 0;
static long long err_total_count = 0;
static __kernel_time_t last_time = 0;
static void adsp_err_check_restart(u32 adsp_error)
{
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0))
struct timespec64 curtime;
#else
struct timeval curtime;
#endif
pr_err("%s: DSP returned error adsp_err = 0x%x total = %lld\n", __func__, adsp_error, err_total_count);
if (adsp_error == ADSP_ENEEDMORE || adsp_error == ADSP_ENOMEMORY) {
err_count++;
err_total_count++;
pr_err("%s: DSP returned error ADSP_ENEEDMORE or ADSP_ENOMEMORY adsp_err=0x%x\n",
__func__, adsp_error);
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0))
ktime_get_real_ts64(&curtime);
#else
do_gettimeofday(&curtime);
#endif
pr_err("%s: err_count = %d [%lld - %lld = %lld]\n", __func__,
err_count, curtime.tv_sec, last_time, curtime.tv_sec - last_time);
if ((err_count >= ADSP_ERR_LIMITED_COUNT) &&
(curtime.tv_sec - last_time <= ADSP_ERR_LIMITED_TIME)) {
err_count = 0;
pr_err("%s: DSP returned error more than limited, restart now !\n", __func__);
subsystem_restart("adsp");
}
last_time = curtime.tv_sec;
if (err_count >= ADSP_ERR_LIMITED_COUNT) {
pr_err("%s: DSP returned error more than limited and err_count to 0!\n", __func__);
err_count = 0;
}
}
}
#else
static void adsp_err_check_restart(u32 adsp_error) {}
#endif
int adsp_err_get_lnx_err_code(u32 adsp_error)
{
adsp_err_check_panic(adsp_error);
adsp_err_check_restart(adsp_error);
if (adsp_error > ADSP_ERR_MAX)
return adsp_err_code_info[ADSP_ERR_MAX].lnx_err_code;

View file

@ -0,0 +1,255 @@
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kobject.h>
#include <linux/sysfs.h>
#include <linux/string.h>
#include <linux/mmhardware_sysfs.h>
/* show */
static ssize_t mm_register_show(struct kobject *dev,
struct kobj_attribute *a, char *buf)
{
struct mm_info *mi = container_of(a, struct mm_info, k_attr);
switch (mi->mm_id) {
case MM_HW_ADSP:
if (!mi->on_register) {
pr_info("%s: 0x%x is not registered\n", __func__, mi->mm_id);
}
return sprintf(buf, "%d\n", mi->on_register);
break;
case MM_HW_CODEC:
if (!mi->on_register) {
pr_info("%s: 0x%x is not registered\n", __func__, mi->mm_id);
}
return sprintf(buf, "%d\n", mi->on_register);
break;
case MM_HW_PA_1:
if (!mi->on_register) {
pr_info("%s: 0x%x is not registered\n", __func__, mi->mm_id);
}
return sprintf(buf, "%d\n%d\n", mi->on_register, mi->on_calibration);
break;
case MM_HW_PA_2:
if (!mi->on_register) {
pr_info("%s: 0x%x is not registered\n", __func__, mi->mm_id);
}
return sprintf(buf, "%d\n%d\n", mi->on_register, mi->on_calibration);
break;
case MM_HW_PA_3:
if (!mi->on_register) {
pr_info("%s: 0x%x is not registered\n", __func__, mi->mm_id);
}
return sprintf(buf, "%d\n%d\n", mi->on_register, mi->on_calibration);
break;
case MM_HW_PA_4:
if (!mi->on_register) {
pr_info("%s: 0x%x is not registered\n", __func__, mi->mm_id);
}
return sprintf(buf, "%d\n%d\n", mi->on_register, mi->on_calibration);
break;
case MM_HW_PA_5:
if (!mi->on_register) {
pr_info("%s: 0x%x is not registered\n", __func__, mi->mm_id);
}
return sprintf(buf, "%d\n%d\n", mi->on_register, mi->on_calibration);
break;
case MM_HW_PA_6:
if (!mi->on_register) {
pr_info("%s: 0x%x is not registered\n", __func__, mi->mm_id);
}
return sprintf(buf, "%d\n%d\n", mi->on_register, mi->on_calibration);
break;
case MM_HW_PA_7:
if (!mi->on_register) {
pr_info("%s: 0x%x is not registered\n", __func__, mi->mm_id);
}
return sprintf(buf, "%d\n%d\n", mi->on_register, mi->on_calibration);
break;
case MM_HW_PA_8:
if (!mi->on_register) {
pr_info("%s: 0x%x is not registered\n", __func__, mi->mm_id);
}
return sprintf(buf, "%d\n%d\n", mi->on_register, mi->on_calibration);
break;
default:
break;
}
return 0;
}
/* store */
static ssize_t mm_register_store(struct kobject *dev,
struct kobj_attribute *a, const char *buf, size_t count)
{
return count;
}
MM_INFO(MM_HW_ADSP, adsp);
MM_INFO(MM_HW_CODEC, codec);
MM_INFO(MM_HW_PA_1, pa1);
MM_INFO(MM_HW_PA_2, pa2);
MM_INFO(MM_HW_PA_3, pa3);
MM_INFO(MM_HW_PA_4, pa4);
MM_INFO(MM_HW_PA_5, pa5);
MM_INFO(MM_HW_PA_6, pa6);
MM_INFO(MM_HW_PA_7, pa7);
MM_INFO(MM_HW_PA_8, pa8);
static struct attribute *mm_attrs[] = {
&adsp_info.k_attr.attr,
&codec_info.k_attr.attr,
&pa1_info.k_attr.attr,
&pa2_info.k_attr.attr,
&pa3_info.k_attr.attr,
&pa4_info.k_attr.attr,
&pa5_info.k_attr.attr,
&pa6_info.k_attr.attr,
&pa7_info.k_attr.attr,
&pa8_info.k_attr.attr,
NULL, /* need to NULL terminate the list of attributes */
};
static struct attribute_group mm_attr_group = {
.attrs = mm_attrs,
};
static struct kobject *mm_sysfs_kobj;
int mmhardware_initialize_sysfs(void)
{
int err;
/* create mm_hardware under /sys */
mm_sysfs_kobj = kobject_create_and_add(MM_HARDWARE_SYSFS_ROOT_FOLDER, kernel_kobj->parent);
if (!mm_sysfs_kobj) {
pr_err("failed to create kobj");
return -ENOMEM;
}
err = sysfs_create_group(mm_sysfs_kobj, &mm_attr_group);
if (err) {
pr_err("failed to create sysfs group");
kobject_put(mm_sysfs_kobj);
return -ENOMEM;
}
return 0;
}
void mmhardware_cleanup_sysfs(void)
{
kobject_put(mm_sysfs_kobj);
}
int register_kobj_under_mmsysfs(enum hardware_id mm_id, const char *name)
{
int ret = 0;
int iter = 0;
int find_id = 0;
struct mm_info *mi = NULL;
struct kobj_attribute *mi_attr = NULL;
struct attribute *a = mm_attrs[iter];
if (name == NULL) {
pr_err("%s: device_name is empty\n", __func__);
ret = -2;
goto err;
}
while (a) {
mi_attr = container_of(a, struct kobj_attribute, attr);
mi = container_of(mi_attr, struct mm_info, k_attr);
iter++;
a = mm_attrs[iter];
if (mm_id == mi->mm_id) {
find_id = 1;
if (mi->on_register) {
pr_info("%s: device(id:%d name:%s) has already registered\n", __func__, mi->mm_id, name);
ret = -4;
goto err;
}
mi->on_register = 1;
goto err;
} else continue;
}
if (find_id == 0) {
pr_err("%s: Can't find correct hardware_id: 0x%x\n", __func__, mm_id);
ret = -3;
}
err:
return ret;
}
EXPORT_SYMBOL(register_kobj_under_mmsysfs);
int on_calibration_under_mmsysfs(enum hardware_id mm_id, const char *name)
{
int ret = 0;
int iter = 0;
int find_id = 0;
struct mm_info *mi = NULL;
struct kobj_attribute *mi_attr = NULL;
struct attribute *a = mm_attrs[iter];
if (name == NULL) {
pr_err("%s: device_name is empty\n", __func__);
ret = -2;
goto err;
}
while (a) {
mi_attr = container_of(a, struct kobj_attribute, attr);
mi = container_of(mi_attr, struct mm_info, k_attr);
iter++;
a = mm_attrs[iter];
if (mm_id == mi->mm_id) {
find_id = 1;
switch (mm_id) {
case MM_HW_PA_1:
mi->on_calibration = 1;
break;
case MM_HW_PA_2:
mi->on_calibration = 1;
break;
case MM_HW_PA_3:
mi->on_calibration = 1;
break;
case MM_HW_PA_4:
mi->on_calibration = 1;
break;
case MM_HW_PA_5:
mi->on_calibration = 1;
break;
case MM_HW_PA_6:
mi->on_calibration = 1;
break;
case MM_HW_PA_7:
mi->on_calibration = 1;
break;
case MM_HW_PA_8:
mi->on_calibration = 1;
break;
default:
break;
}
goto err;
} else continue;
}
if (find_id == 0) {
pr_err("%s: Can't find correct hardware_id: 0x%x\n", __func__, mm_id);
ret = -3;
}
err:
return ret;
}
EXPORT_SYMBOL(on_calibration_under_mmsysfs);
module_init(mmhardware_initialize_sysfs);
module_exit(mmhardware_cleanup_sysfs);
MODULE_AUTHOR("xiaomi mm");
MODULE_DESCRIPTION("Multimedia hardware detection");
MODULE_LICENSE("GPL");

View file

@ -81,6 +81,7 @@ void audio_cal_exit(void);
void voice_exit(void);
void q6lsm_exit(void);
void q6asm_exit(void);
/* for elus start */
#ifdef CONFIG_ELUS_PROXIMITY
int elliptic_driver_exit(void);

View file

@ -388,7 +388,7 @@ static int adm_get_copp_id(int port_idx, int copp_idx)
static int adm_get_idx_if_single_copp_exists(int port_idx,
int topology,
int rate, int bit_width,
uint32_t copp_token)
uint32_t copp_token, int channel_mode)
{
int idx;
@ -402,14 +402,16 @@ static int adm_get_idx_if_single_copp_exists(int port_idx,
(bit_width ==
atomic_read(&this_adm.copp.bit_width[port_idx][idx])) &&
(copp_token ==
atomic_read(&this_adm.copp.token[port_idx][idx])))
atomic_read(&this_adm.copp.token[port_idx][idx])) &&
(channel_mode ==
atomic_read(&this_adm.copp.channels[port_idx][idx])))
return idx;
return -EINVAL;
}
static int adm_get_idx_if_copp_exists(int port_idx, int topology, int mode,
int rate, int bit_width, int app_type,
int session_type, uint32_t copp_token)
int session_type, uint32_t copp_token, int channel_mode)
{
int idx;
@ -420,7 +422,8 @@ static int adm_get_idx_if_copp_exists(int port_idx, int topology, int mode,
return adm_get_idx_if_single_copp_exists(port_idx,
topology,
rate, bit_width,
copp_token);
copp_token,
channel_mode);
for (idx = 0; idx < MAX_COPPS_PER_PORT; idx++)
if ((topology ==
@ -433,7 +436,9 @@ static int adm_get_idx_if_copp_exists(int port_idx, int topology, int mode,
atomic_read(
&this_adm.copp.session_type[port_idx][idx])) &&
(app_type ==
atomic_read(&this_adm.copp.app_type[port_idx][idx])))
atomic_read(&this_adm.copp.app_type[port_idx][idx])) &&
(channel_mode ==
atomic_read(&this_adm.copp.channels[port_idx][idx])))
return idx;
return -EINVAL;
}
@ -3675,7 +3680,8 @@ int adm_open_v2(int port_id, int path, int rate, int channel_mode, int topology,
perf_mode,
rate, bit_width,
app_type, session_type,
copp_token);
copp_token,
channel_mode);
if (copp_idx < 0) {
copp_idx = adm_get_next_available_copp(port_idx);

View file

@ -39,8 +39,12 @@
#endif
#ifdef CONFIG_SND_SOC_TFA9874_FOR_DAVI
#if defined(CONFIG_TARGET_PRODUCT_TAOYAO)
#include "../asoc/codecs/tfa9874/inc/tfa_platform_interface_definition.h"
#else
#include "../asoc/codecs/tfa98xx/inc/tfa_platform_interface_definition.h"
#endif
#endif
#ifdef AUDIO_FORCE_RESTART_ADSP
#include <soc/qcom/subsystem_restart.h>
@ -66,6 +70,25 @@ void aw_set_port_id(int tx_port_id, int rx_port_id)
EXPORT_SYMBOL(aw_set_port_id);
#endif /* CONFIG_SND_SOC_AW88263S_TDM */
#if defined(CONFIG_SND_SOC_AW88263S_M20_TDM)
#define AFE_MODULE_ID_AWDSP_TX (0x10013D00)
#define AFE_MODULE_ID_AWDSP_RX (0x10013D01)
#define AFE_PARAM_ID_AWDSP_RX_SET_ENABLE (0x10013D11)
#define AFE_PARAM_ID_AWDSP_TX_SET_ENABLE (0x10013D13)
#define AFE_PARAM_ID_AWDSP_RX_PARAMS (0x10013D12)
void aw_cal_unmap_memory(void);
static int g_aw_tx_port_id = 0;
static int g_aw_rx_port_id = 0;
void aw_set_port_id(int tx_port_id, int rx_port_id)
{
g_aw_tx_port_id = tx_port_id;
g_aw_rx_port_id = rx_port_id;
}
EXPORT_SYMBOL(aw_set_port_id);
#endif /* CONFIG_SND_SOC_AW88263S_M20_TDM */
#define WAKELOCK_TIMEOUT 5000
#define AFE_CLK_TOKEN 1024
#define AFE_NOWAIT_TOKEN 2048
@ -325,6 +348,11 @@ struct afe_ctl {
struct rtac_cal_block_data aw_cal;
atomic_t aw_state;
#endif /* CONFIG_SND_SOC_AW88263S_TDM */
#if defined(CONFIG_SND_SOC_AW88263S_M20_TDM)
struct rtac_cal_block_data aw_cal;
atomic_t aw_state;
#endif /* CONFIG_SND_SOC_AW88263S_M20_TDM */
};
struct afe_clkinfo_per_port {
@ -665,6 +693,10 @@ done:
EXPORT_SYMBOL(afe_get_topology);
#endif /* CONFIG_SND_SOC_AW88263S_TDM */
#if defined(CONFIG_SND_SOC_AW88263S_M20_TDM)
EXPORT_SYMBOL(afe_get_topology);
#endif /* CONFIG_SND_SOC_AW88263S_M20_TDM */
/**
* afe_set_aanc_info -
* Update AFE AANC info
@ -1146,6 +1178,9 @@ static int32_t afe_callback(struct apr_client_data *data, void *priv)
return -EINVAL;
}
if (data->opcode == RESET_EVENTS) {
#ifdef CONFIG_SND_SOC_AW88263S_M20_TDM
aw_cal_unmap_memory();
#endif /*CONFIG_SND_SOC_AW88263S_M20_TDM*/
pr_debug("%s: reset event = %d %d apr[%pK]\n",
__func__,
data->reset_event, data->reset_proc, this_afe.apr);
@ -1214,7 +1249,7 @@ static int32_t afe_callback(struct apr_client_data *data, void *priv)
uint32_t *payload = data->payload;
uint32_t param_id;
uint32_t param_id_pos = 0;
#if defined(CONFIG_TARGET_PRODUCT_LISA) || defined(CONFIG_TARGET_PRODUCT_MONA) || defined(CONFIG_TARGET_PRODUCT_ZIJIN)
#if defined(CONFIG_TARGET_PRODUCT_LISA) || defined(CONFIG_TARGET_PRODUCT_MONA) || defined(CONFIG_TARGET_PRODUCT_ZIJIN) || defined(CONFIG_TARGET_PRODUCT_TAOYAO) || defined(CONFIG_TARGET_PRODUCT_REDWOOD)
#else
#ifdef CONFIG_MSM_CSPL
if (crus_afe_callback(data->payload, data->payload_size) == 0)
@ -1263,6 +1298,21 @@ static int32_t afe_callback(struct apr_client_data *data, void *priv)
}
#endif /* CONFIG_SND_SOC_AW88263S_TDM */
#if defined(CONFIG_SND_SOC_AW88263S_M20_TDM)
if (atomic_read(&this_afe.aw_state) == 1) {
if (!payload[0]) {
atomic_set(&this_afe.state, 0);
} else {
pr_debug("%s: status: %d", __func__, payload[0]);
atomic_set(&this_afe.state, -1);
}
atomic_set(&this_afe.aw_state, 0);
wake_up(&this_afe.wait[data->token]);
return 0;
}
#endif /* CONFIG_SND_SOC_AW88263S_M20_TDM */
if (data->opcode == AFE_PORT_CMDRSP_GET_PARAM_V3)
param_id_pos = 4;
else
@ -2736,6 +2786,17 @@ static int afe_spk_prot_prepare(int src_port, int dst_port, int param_id,
param_info.module_id = AFE_MODULE_ID_AWDSP_TX;
break;
#endif /* CONFIG_SND_SOC_AW88263S_TDM */
#if defined(CONFIG_SND_SOC_AW88263S_M20_TDM)
case AFE_PARAM_ID_AWDSP_RX_SET_ENABLE:
case AFE_PARAM_ID_AWDSP_RX_PARAMS:
param_info.module_id = AFE_MODULE_ID_AWDSP_RX;
break;
case AFE_PARAM_ID_AWDSP_TX_SET_ENABLE:
param_info.module_id = AFE_MODULE_ID_AWDSP_TX;
break;
#endif /*CONFIG_SND_SOC_AW88263S_M20_TDM*/
default:
pr_err("%s: default case 0x%x\n", __func__, param_id);
goto fail_cmd;
@ -6823,7 +6884,7 @@ static int __afe_port_start(u16 port_id, union afe_port_config *afe_config,
goto fail_cmd;
}
ret = afe_send_cmd_port_start(port_id);
#if defined(CONFIG_TARGET_PRODUCT_LISA) || defined(CONFIG_TARGET_PRODUCT_MONA) || defined(CONFIG_TARGET_PRODUCT_ZIJIN)
#if defined(CONFIG_TARGET_PRODUCT_LISA) || defined(CONFIG_TARGET_PRODUCT_MONA) || defined(CONFIG_TARGET_PRODUCT_ZIJIN) || defined(CONFIG_TARGET_PRODUCT_TAOYAO) || defined(CONFIG_TARGET_PRODUCT_REDWOOD)
#else
#if CONFIG_MSM_CSPL
if (ret == 0)
@ -10047,7 +10108,7 @@ int afe_close(int port_id)
atomic_dec(port_ref);
}
#if defined(CONFIG_TARGET_PRODUCT_LISA) || defined(CONFIG_TARGET_PRODUCT_MONA) || defined(CONFIG_TARGET_PRODUCT_ZIJIN)
#if defined(CONFIG_TARGET_PRODUCT_LISA) || defined(CONFIG_TARGET_PRODUCT_MONA) || defined(CONFIG_TARGET_PRODUCT_ZIJIN) || defined(CONFIG_TARGET_PRODUCT_TAOYAO) || defined(CONFIG_TARGET_PRODUCT_REDWOOD)
#else
#if CONFIG_MSM_CSPL
crus_afe_port_close(port_id);
@ -12397,6 +12458,9 @@ static int afe_unmap_cal_data(int32_t cal_type,
ret = afe_cmd_memory_unmap(
cal_block->map_data.q6map_handle);
atomic_set(&this_afe.mem_map_cal_index, -1);
#ifdef CONFIG_SND_SOC_AW88263S_M20_TDM
atomic_set(&this_afe.mem_map_cal_handles[cal_index], 0);
#endif /*CONFIG_SND_SOC_AW88263S_M20_TDM*/
if (ret < 0) {
pr_err("%s: unmap did not work! cal_type %i ret %d\n",
__func__, cal_index, ret);
@ -12799,6 +12863,180 @@ EXPORT_SYMBOL(send_tfa_cal_set_tx_enable);
#endif /*CONFIG_SND_SOC_TFA9874_FOR_DAVI*/
#ifdef CONFIG_SND_SOC_AW88263S_M20_TDM
int aw_send_afe_rx_module_enable(void *buf, int size)
{
union afe_spkr_prot_config config;
int32_t port_id =g_aw_rx_port_id;
if (size > sizeof(config))
return -EINVAL;
memcpy(&config, buf, size);
if (afe_spk_prot_prepare(port_id, 0,
AFE_PARAM_ID_AWDSP_RX_SET_ENABLE, &config, size)) {
pr_err("%s: set bypass failed \n", __func__);
return -EINVAL;
}
return 0;
}
EXPORT_SYMBOL(aw_send_afe_rx_module_enable);
int aw_send_afe_tx_module_enable(void *buf, int size)
{
union afe_spkr_prot_config config;
int32_t port_id = g_aw_tx_port_id;
if (size > sizeof(config))
return -EINVAL;
memcpy(&config, buf, size);
if (afe_spk_prot_prepare(port_id, 0,
AFE_PARAM_ID_AWDSP_TX_SET_ENABLE, &config, size)) {
pr_err("%s: set bypass failed \n", __func__);
return -EINVAL;
}
return 0;
}
EXPORT_SYMBOL(aw_send_afe_tx_module_enable);
int aw_send_afe_cal_apr(uint32_t param_id, void *buf, int cmd_size, bool write)
{
int32_t result = 0, port_id = g_aw_rx_port_id;
int32_t module_id = AFE_MODULE_ID_AWDSP_RX;
uint32_t port_index = 0;
uint32_t payload_size = 0;
size_t len;
struct rtac_cal_block_data *aw_cal = &(this_afe.aw_cal);
struct mem_mapping_hdr mem_hdr;
struct param_hdr_v3 param_hdr;
pr_debug("%s: enter\n", __func__);
if (param_id == AFE_PARAM_ID_AWDSP_TX_SET_ENABLE) {
port_id = g_aw_tx_port_id;
module_id = AFE_MODULE_ID_AWDSP_TX;
}
if (aw_cal->map_data.dma_buf == 0) {
/*Minimal chunk size is 16K*/
aw_cal->map_data.map_size = SZ_16K;
result = msm_audio_ion_alloc(&(aw_cal->map_data.dma_buf),
aw_cal->map_data.map_size,
&(aw_cal->cal_data.paddr),&len,
&(aw_cal->cal_data.kvaddr));
if (result < 0) {
pr_err("%s: allocate buffer failed! ret = %d\n",
__func__, result);
goto err;
}
}
if (aw_cal->map_data.map_handle == 0) {
result = afe_map_rtac_block(aw_cal);
if (result < 0) {
pr_err("%s: map buffer failed! ret = %d\n",
__func__, result);
goto err;
}
}
port_index = q6audio_get_port_index(port_id);
if (port_index >= AFE_MAX_PORTS) {
pr_err("%s: Invalid AFE port = 0x%x\n", __func__, port_id);
goto err;
}
if (cmd_size > (SZ_16K - sizeof(struct param_hdr_v3))) {
pr_err("%s: Invalid payload size = %d\n", __func__, cmd_size);
result = -EINVAL;
goto err;
}
/* Pack message header with data */
param_hdr.module_id = module_id;
param_hdr.instance_id = INSTANCE_ID_0;
param_hdr.param_size = cmd_size;
if (write) {
param_hdr.param_id = param_id;
q6common_pack_pp_params(aw_cal->cal_data.kvaddr,
&param_hdr,
buf,
&payload_size);
aw_cal->cal_data.size = payload_size;
} else {
param_hdr.param_id = param_id;
aw_cal->cal_data.size = cmd_size + sizeof(struct param_hdr_v3);
}
/*Send/Get package to/from ADSP*/
mem_hdr.data_payload_addr_lsw =
lower_32_bits(aw_cal->cal_data.paddr);
mem_hdr.data_payload_addr_msw =
msm_audio_populate_upper_32_bits(aw_cal->cal_data.paddr);
mem_hdr.mem_map_handle =
aw_cal->map_data.map_handle;
pr_debug("%s: Sending aw_cal port = 0x%x, cal size = %zd, cal addr = 0x%pK\n",
__func__, port_id, aw_cal->cal_data.size, &aw_cal->cal_data.paddr);
result = afe_q6_interface_prepare();
if (result != 0) {
pr_err("%s: Q6 interface prepare failed %d\n", __func__, result);
goto err;
}
if (write) {
if (q6common_is_instance_id_supported())
result = q6afe_set_params_v3(port_id, port_index, &mem_hdr, NULL, payload_size);
else
result = q6afe_set_params_v2(port_id, port_index, &mem_hdr, NULL, payload_size);
} else {
int8_t *resp = (int8_t *)aw_cal->cal_data.kvaddr;
atomic_set(&this_afe.aw_state, 1);
if (q6common_is_instance_id_supported()) {
result = q6afe_get_params_v3(port_id, port_index, &mem_hdr, &param_hdr);
resp += sizeof(struct param_hdr_v3);
} else {
result = q6afe_get_params_v2(port_id, port_index, &mem_hdr, &param_hdr);
resp += sizeof(struct param_hdr_v1);
}
if (result) {
pr_err("%s: get response from port 0x%x failed %d\n",
__func__, port_id, result);
goto err;
}
else {
/*Copy response data to command buffer*/
memcpy(buf, resp, cmd_size);
}
}
err:
return result;
}
EXPORT_SYMBOL(aw_send_afe_cal_apr);
void aw_cal_unmap_memory(void)
{
int result = 0;
if (this_afe.aw_cal.map_data.map_handle) {
result = afe_unmap_rtac_block(&this_afe.aw_cal.map_data.map_handle);
/*Force to remap after unmap failed*/
if (result)
this_afe.aw_cal.map_data.map_handle = 0;
}
}
EXPORT_SYMBOL(aw_cal_unmap_memory);
#endif
int __init afe_init(void)
{
int i = 0, ret;
@ -12879,6 +13117,10 @@ void afe_exit(void)
aw_cal_unmap_memory();
#endif /* CONFIG_SND_SOC_AW88263S_TDM */
#if defined(CONFIG_SND_SOC_AW88263S_M20_TDM)
aw_cal_unmap_memory();
#endif /* CONFIG_SND_SOC_AW88263S_M20_TDM */
if (this_afe.apr) {
apr_reset(this_afe.apr);
atomic_set(&this_afe.state, 0);

View file

@ -23,7 +23,7 @@
#include <soc/snd_event.h>
#include <ipc/apr.h>
#include "adsp_err.h"
#define DEBUG
#define TIMEOUT_MS 1000
/*
* AVS bring up in the modem is optimized for the new

View file

@ -4272,7 +4272,7 @@ static int voice_send_cvp_channel_info_v2(struct voice_data *v,
case EC_REF_PATH:
channel_info_param_data->param_id =
VSS_PARAM_VOCPROC_EC_REF_CHANNEL_INFO;
#if defined(CONFIG_TARGET_PRODUCT_CETUS) || defined(CONFIG_TARGET_PRODUCT_ARGO)
#if defined(CONFIG_TARGET_PRODUCT_CETUS)
if (v->dev_rx.port_id == 0x9020)
channel_info->num_channels = 4;
else

View file

@ -139,7 +139,11 @@ do { \
#define SPECIAL_HS_DETECT_TIME_MS (2 * 1000)
#define MBHC_BUTTON_PRESS_THRESHOLD_MIN 250
#define GND_MIC_SWAP_THRESHOLD 4
#ifdef CONFIG_TARGET_PRODUCT_TAOYAO
#define GND_MIC_USBC_SWAP_THRESHOLD 4
#else
#define GND_MIC_USBC_SWAP_THRESHOLD 2
#endif
#define WCD_FAKE_REMOVAL_MIN_PERIOD_MS 100
#define HS_VREF_MIN_VAL 1400
#define FW_READ_ATTEMPTS 15
@ -260,6 +264,7 @@ enum {
MICB_PULLUP_DISABLE,
MICB_ENABLE,
MICB_DISABLE,
MICB2_DISABLE,
};
enum {

View file

@ -31,6 +31,7 @@
#include <dsp/audio_notifier.h>
#include <ipc/apr.h>
#include <ipc/apr_tal.h>
#include <linux/mmhardware_sysfs.h>
#define APR_PKT_IPC_LOG_PAGE_CNT 2
@ -317,7 +318,10 @@ static void apr_adsp_up(void)
pr_info("%s: Q6 is Up\n", __func__);
place_marker("M - ADSP Ready");
apr_set_q6_state(APR_SUBSYS_LOADED);
/* register adsp hardware */
#ifdef CONFIG_MMHARDWARE_DETECTION
register_kobj_under_mmsysfs(MM_HW_ADSP, MM_HARDWARE_SYSFS_ADSP_FOLDER);
#endif
spin_lock(&apr_priv->apr_lock);
if (apr_priv->is_initial_boot)
schedule_work(&apr_priv->add_chld_dev_work);