audio: Update from redwood-s-oss
Change-Id: Iff2fb143a43da2f2905bf77df30c8b6e4468a3f0
This commit is contained in:
parent
9e11ed878f
commit
d7f4b8d1b6
28 changed files with 912 additions and 35 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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},
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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")),
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
255
techpack/audio/dsp/mmhardware_sysfs.c
Normal file
255
techpack/audio/dsp/mmhardware_sysfs.c
Normal 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");
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
¶m_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, ¶m_hdr);
|
||||
resp += sizeof(struct param_hdr_v3);
|
||||
} else {
|
||||
result = q6afe_get_params_v2(port_id, port_index, &mem_hdr, ¶m_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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue