Merge "dsp: add support to set topology specific info in voice usecases"
diff --git a/asoc/codecs/sdm660_cdc/Makefile b/asoc/codecs/sdm660_cdc/Makefile
index d846fae..0ebf407 100644
--- a/asoc/codecs/sdm660_cdc/Makefile
+++ b/asoc/codecs/sdm660_cdc/Makefile
@@ -1,2 +1,4 @@
-snd-soc-sdm660-cdc-objs := msm-analog-cdc.o msm-digital-cdc.o sdm660-regmap.o
-obj-$(CONFIG_SND_SOC_SDM660_CDC) += snd-soc-sdm660-cdc.o sdm660-cdc-irq.o
+snd-soc-analog-cdc-objs := sdm660-cdc-irq.o msm-analog-cdc.o
+snd-soc-digital-cdc-objs := msm-digital-cdc.o msm-digital-cdc-regmap.o
+obj-$(CONFIG_SND_SOC_ANALOG_CDC) += snd-soc-analog-cdc.o
+obj-$(CONFIG_SND_SOC_DIGITAL_CDC) += snd-soc-digital-cdc.o
diff --git a/asoc/codecs/sdm660_cdc/msm-analog-cdc-regmap.h b/asoc/codecs/sdm660_cdc/msm-analog-cdc-regmap.h
new file mode 100644
index 0000000..55846a1
--- /dev/null
+++ b/asoc/codecs/sdm660_cdc/msm-analog-cdc-regmap.h
@@ -0,0 +1,186 @@
+/*
+ * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef ANALOG_CDC_REGMAP_H
+#define ANALOG_CDC_REGMAP_H
+
+#include <linux/regmap.h>
+#include "sdm660-cdc-registers.h"
+
+/*
+ * Default register reset values that are common across different versions
+ * are defined here. If a register reset value is changed based on version
+ * then remove it from this structure and add it in version specific
+ * structures.
+ */
+
+struct reg_default
+ msm89xx_pmic_cdc_defaults[MSM89XX_PMIC_CDC_CACHE_SIZE] = {
+ {MSM89XX_PMIC_DIGITAL_REVISION1, 0x00},
+ {MSM89XX_PMIC_DIGITAL_REVISION2, 0x00},
+ {MSM89XX_PMIC_DIGITAL_PERPH_TYPE, 0x23},
+ {MSM89XX_PMIC_DIGITAL_PERPH_SUBTYPE, 0x01},
+ {MSM89XX_PMIC_DIGITAL_INT_RT_STS, 0x00},
+ {MSM89XX_PMIC_DIGITAL_INT_SET_TYPE, 0xFF},
+ {MSM89XX_PMIC_DIGITAL_INT_POLARITY_HIGH, 0xFF},
+ {MSM89XX_PMIC_DIGITAL_INT_POLARITY_LOW, 0x00},
+ {MSM89XX_PMIC_DIGITAL_INT_LATCHED_CLR, 0x00},
+ {MSM89XX_PMIC_DIGITAL_INT_EN_SET, 0x00},
+ {MSM89XX_PMIC_DIGITAL_INT_EN_CLR, 0x00},
+ {MSM89XX_PMIC_DIGITAL_INT_LATCHED_STS, 0x00},
+ {MSM89XX_PMIC_DIGITAL_INT_PENDING_STS, 0x00},
+ {MSM89XX_PMIC_DIGITAL_INT_MID_SEL, 0x00},
+ {MSM89XX_PMIC_DIGITAL_INT_PRIORITY, 0x00},
+ {MSM89XX_PMIC_DIGITAL_GPIO_MODE, 0x00},
+ {MSM89XX_PMIC_DIGITAL_PIN_CTL_OE, 0x01},
+ {MSM89XX_PMIC_DIGITAL_PIN_CTL_DATA, 0x00},
+ {MSM89XX_PMIC_DIGITAL_PIN_STATUS, 0x00},
+ {MSM89XX_PMIC_DIGITAL_HDRIVE_CTL, 0x00},
+ {MSM89XX_PMIC_DIGITAL_CDC_RST_CTL, 0x00},
+ {MSM89XX_PMIC_DIGITAL_CDC_TOP_CLK_CTL, 0x00},
+ {MSM89XX_PMIC_DIGITAL_CDC_ANA_CLK_CTL, 0x00},
+ {MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, 0x00},
+ {MSM89XX_PMIC_DIGITAL_CDC_CONN_TX1_CTL, 0x02},
+ {MSM89XX_PMIC_DIGITAL_CDC_CONN_TX2_CTL, 0x02},
+ {MSM89XX_PMIC_DIGITAL_CDC_CONN_HPHR_DAC_CTL, 0x00},
+ {MSM89XX_PMIC_DIGITAL_CDC_CONN_RX1_CTL, 0x00},
+ {MSM89XX_PMIC_DIGITAL_CDC_CONN_RX2_CTL, 0x00},
+ {MSM89XX_PMIC_DIGITAL_CDC_CONN_RX3_CTL, 0x00},
+ {MSM89XX_PMIC_DIGITAL_CDC_CONN_RX_LB_CTL, 0x00},
+ {MSM89XX_PMIC_DIGITAL_CDC_RX_CTL1, 0x7C},
+ {MSM89XX_PMIC_DIGITAL_CDC_RX_CTL2, 0x7C},
+ {MSM89XX_PMIC_DIGITAL_CDC_RX_CTL3, 0x7C},
+ {MSM89XX_PMIC_DIGITAL_DEM_BYPASS_DATA0, 0x00},
+ {MSM89XX_PMIC_DIGITAL_DEM_BYPASS_DATA1, 0x00},
+ {MSM89XX_PMIC_DIGITAL_DEM_BYPASS_DATA2, 0x00},
+ {MSM89XX_PMIC_DIGITAL_DEM_BYPASS_DATA3, 0x00},
+ {MSM89XX_PMIC_DIGITAL_DIG_DEBUG_CTL, 0x00},
+ {MSM89XX_PMIC_DIGITAL_DIG_DEBUG_EN, 0x00},
+ {MSM89XX_PMIC_DIGITAL_SPARE_0, 0x00},
+ {MSM89XX_PMIC_DIGITAL_SPARE_1, 0x00},
+ {MSM89XX_PMIC_DIGITAL_SPARE_2, 0x00},
+ {MSM89XX_PMIC_DIGITAL_SEC_ACCESS, 0x00},
+ {MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL1, 0x00},
+ {MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL2, 0x02},
+ {MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL3, 0x05},
+ {MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL4, 0x00},
+ {MSM89XX_PMIC_DIGITAL_INT_TEST1, 0x00},
+ {MSM89XX_PMIC_DIGITAL_INT_TEST_VAL, 0x00},
+ {MSM89XX_PMIC_DIGITAL_TRIM_NUM, 0x00},
+ {MSM89XX_PMIC_DIGITAL_TRIM_CTRL, 0x00},
+ {MSM89XX_PMIC_ANALOG_REVISION1, 0x00},
+ {MSM89XX_PMIC_ANALOG_REVISION2, 0x00},
+ {MSM89XX_PMIC_ANALOG_REVISION3, 0x00},
+ {MSM89XX_PMIC_ANALOG_REVISION4, 0x00},
+ {MSM89XX_PMIC_ANALOG_PERPH_TYPE, 0x23},
+ {MSM89XX_PMIC_ANALOG_PERPH_SUBTYPE, 0x09},
+ {MSM89XX_PMIC_ANALOG_INT_RT_STS, 0x00},
+ {MSM89XX_PMIC_ANALOG_INT_SET_TYPE, 0x3F},
+ {MSM89XX_PMIC_ANALOG_INT_POLARITY_HIGH, 0x3F},
+ {MSM89XX_PMIC_ANALOG_INT_POLARITY_LOW, 0x00},
+ {MSM89XX_PMIC_ANALOG_INT_LATCHED_CLR, 0x00},
+ {MSM89XX_PMIC_ANALOG_INT_EN_SET, 0x00},
+ {MSM89XX_PMIC_ANALOG_INT_EN_CLR, 0x00},
+ {MSM89XX_PMIC_ANALOG_INT_LATCHED_STS, 0x00},
+ {MSM89XX_PMIC_ANALOG_INT_PENDING_STS, 0x00},
+ {MSM89XX_PMIC_ANALOG_INT_MID_SEL, 0x00},
+ {MSM89XX_PMIC_ANALOG_INT_PRIORITY, 0x00},
+ {MSM89XX_PMIC_ANALOG_MICB_1_EN, 0x00},
+ {MSM89XX_PMIC_ANALOG_MICB_1_VAL, 0x20},
+ {MSM89XX_PMIC_ANALOG_MICB_1_CTL, 0x00},
+ {MSM89XX_PMIC_ANALOG_MICB_1_INT_RBIAS, 0x49},
+ {MSM89XX_PMIC_ANALOG_MICB_2_EN, 0x20},
+ {MSM89XX_PMIC_ANALOG_TX_1_2_ATEST_CTL_2, 0x00},
+ {MSM89XX_PMIC_ANALOG_MASTER_BIAS_CTL, 0x00},
+ {MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_1, 0x35},
+ {MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_2, 0x08},
+ {MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL, 0x00},
+ {MSM89XX_PMIC_ANALOG_MBHC_DBNC_TIMER, 0x98},
+ {MSM89XX_PMIC_ANALOG_MBHC_BTN0_ZDETL_CTL, 0x00},
+ {MSM89XX_PMIC_ANALOG_MBHC_BTN1_ZDETM_CTL, 0x20},
+ {MSM89XX_PMIC_ANALOG_MBHC_BTN2_ZDETH_CTL, 0x40},
+ {MSM89XX_PMIC_ANALOG_MBHC_BTN3_CTL, 0x61},
+ {MSM89XX_PMIC_ANALOG_MBHC_BTN4_CTL, 0x80},
+ {MSM89XX_PMIC_ANALOG_MBHC_BTN_RESULT, 0x00},
+ {MSM89XX_PMIC_ANALOG_MBHC_ZDET_ELECT_RESULT, 0x00},
+ {MSM89XX_PMIC_ANALOG_TX_1_EN, 0x03},
+ {MSM89XX_PMIC_ANALOG_TX_2_EN, 0x03},
+ {MSM89XX_PMIC_ANALOG_TX_1_2_TEST_CTL_1, 0xBF},
+ {MSM89XX_PMIC_ANALOG_TX_1_2_TEST_CTL_2, 0x8C},
+ {MSM89XX_PMIC_ANALOG_TX_1_2_ATEST_CTL, 0x00},
+ {MSM89XX_PMIC_ANALOG_TX_1_2_OPAMP_BIAS, 0x6B},
+ {MSM89XX_PMIC_ANALOG_TX_1_2_TXFE_CLKDIV, 0x51},
+ {MSM89XX_PMIC_ANALOG_TX_3_EN, 0x02},
+ {MSM89XX_PMIC_ANALOG_NCP_EN, 0x26},
+ {MSM89XX_PMIC_ANALOG_NCP_CLK, 0x23},
+ {MSM89XX_PMIC_ANALOG_NCP_DEGLITCH, 0x5B},
+ {MSM89XX_PMIC_ANALOG_NCP_FBCTRL, 0x08},
+ {MSM89XX_PMIC_ANALOG_NCP_BIAS, 0x29},
+ {MSM89XX_PMIC_ANALOG_NCP_VCTRL, 0x24},
+ {MSM89XX_PMIC_ANALOG_NCP_TEST, 0x00},
+ {MSM89XX_PMIC_ANALOG_NCP_CLIM_ADDR, 0xD5},
+ {MSM89XX_PMIC_ANALOG_RX_CLOCK_DIVIDER, 0xE8},
+ {MSM89XX_PMIC_ANALOG_RX_COM_OCP_CTL, 0xCF},
+ {MSM89XX_PMIC_ANALOG_RX_COM_OCP_COUNT, 0x6E},
+ {MSM89XX_PMIC_ANALOG_RX_COM_BIAS_DAC, 0x18},
+ {MSM89XX_PMIC_ANALOG_RX_HPH_BIAS_PA, 0x5A},
+ {MSM89XX_PMIC_ANALOG_RX_HPH_BIAS_LDO_OCP, 0x69},
+ {MSM89XX_PMIC_ANALOG_RX_HPH_BIAS_CNP, 0x29},
+ {MSM89XX_PMIC_ANALOG_RX_HPH_CNP_EN, 0x80},
+ {MSM89XX_PMIC_ANALOG_RX_HPH_CNP_WG_CTL, 0xDA},
+ {MSM89XX_PMIC_ANALOG_RX_HPH_CNP_WG_TIME, 0x16},
+ {MSM89XX_PMIC_ANALOG_RX_HPH_L_TEST, 0x00},
+ {MSM89XX_PMIC_ANALOG_RX_HPH_L_PA_DAC_CTL, 0x20},
+ {MSM89XX_PMIC_ANALOG_RX_HPH_R_TEST, 0x00},
+ {MSM89XX_PMIC_ANALOG_RX_HPH_R_PA_DAC_CTL, 0x20},
+ {MSM89XX_PMIC_ANALOG_RX_EAR_CTL, 0x12},
+ {MSM89XX_PMIC_ANALOG_RX_ATEST, 0x00},
+ {MSM89XX_PMIC_ANALOG_RX_HPH_STATUS, 0x0C},
+ {MSM89XX_PMIC_ANALOG_RX_EAR_STATUS, 0x00},
+ {MSM89XX_PMIC_ANALOG_RX_LO_DAC_CTL, 0x00},
+ {MSM89XX_PMIC_ANALOG_RX_LO_EN_CTL, 0x00},
+ {MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL, 0x83},
+ {MSM89XX_PMIC_ANALOG_SPKR_DRV_CLIP_DET, 0x91},
+ {MSM89XX_PMIC_ANALOG_SPKR_DRV_CTL, 0x29},
+ {MSM89XX_PMIC_ANALOG_SPKR_ANA_BIAS_SET, 0x4D},
+ {MSM89XX_PMIC_ANALOG_SPKR_OCP_CTL, 0xE1},
+ {MSM89XX_PMIC_ANALOG_SPKR_PWRSTG_CTL, 0x1E},
+ {MSM89XX_PMIC_ANALOG_SPKR_DRV_MISC, 0xCB},
+ {MSM89XX_PMIC_ANALOG_SPKR_DRV_DBG, 0x00},
+ {MSM89XX_PMIC_ANALOG_CURRENT_LIMIT, 0x02},
+ {MSM89XX_PMIC_ANALOG_OUTPUT_VOLTAGE, 0x14},
+ {MSM89XX_PMIC_ANALOG_BYPASS_MODE, 0x00},
+ {MSM89XX_PMIC_ANALOG_BOOST_EN_CTL, 0x1F},
+ {MSM89XX_PMIC_ANALOG_SLOPE_COMP_IP_ZERO, 0x8C},
+ {MSM89XX_PMIC_ANALOG_RDSON_MAX_DUTY_CYCLE, 0xC0},
+ {MSM89XX_PMIC_ANALOG_BOOST_TEST1_1, 0x00},
+ {MSM89XX_PMIC_ANALOG_BOOST_TEST_2, 0x00},
+ {MSM89XX_PMIC_ANALOG_SPKR_SAR_STATUS, 0x00},
+ {MSM89XX_PMIC_ANALOG_SPKR_DRV_STATUS, 0x00},
+ {MSM89XX_PMIC_ANALOG_PBUS_ADD_CSR, 0x00},
+ {MSM89XX_PMIC_ANALOG_PBUS_ADD_SEL, 0x00},
+ {MSM89XX_PMIC_ANALOG_SEC_ACCESS, 0x00},
+ {MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL1, 0x00},
+ {MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL2, 0x01},
+ {MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL3, 0x05},
+ {MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL4, 0x00},
+ {MSM89XX_PMIC_ANALOG_INT_TEST1, 0x00},
+ {MSM89XX_PMIC_ANALOG_INT_TEST_VAL, 0x00},
+ {MSM89XX_PMIC_ANALOG_TRIM_NUM, 0x04},
+ {MSM89XX_PMIC_ANALOG_TRIM_CTRL1, 0x00},
+ {MSM89XX_PMIC_ANALOG_TRIM_CTRL2, 0x00},
+ {MSM89XX_PMIC_ANALOG_TRIM_CTRL3, 0x00},
+ {MSM89XX_PMIC_ANALOG_TRIM_CTRL4, 0x00},
+};
+
+#endif
diff --git a/asoc/codecs/sdm660_cdc/msm-analog-cdc.c b/asoc/codecs/sdm660_cdc/msm-analog-cdc.c
index ddef508..623303c 100644
--- a/asoc/codecs/sdm660_cdc/msm-analog-cdc.c
+++ b/asoc/codecs/sdm660_cdc/msm-analog-cdc.c
@@ -30,7 +30,7 @@
#include "msm-analog-cdc.h"
#include "msm-cdc-common.h"
#include "sdm660-cdc-irq.h"
-#include "sdm660-cdc-registers.h"
+#include "msm-analog-cdc-regmap.h"
#include "../../sdm660-common.h"
#include "../wcd-mbhc-v2-api.h"
@@ -351,6 +351,7 @@
dev_dbg(codec->dev, "%s: Enter\n", __func__);
sdm660_cdc->codec_spk_ext_pa_cb = codec_spk_ext_pa;
}
+EXPORT_SYMBOL(msm_anlg_cdc_spk_ext_pa_cb);
static void msm_anlg_cdc_compute_impedance(struct snd_soc_codec *codec, s16 l,
s16 r, uint32_t *zl, uint32_t *zr,
@@ -3172,6 +3173,7 @@
}
return 0;
}
+EXPORT_SYMBOL(msm_anlg_cdc_mclk_enable);
static int msm_anlg_cdc_set_dai_sysclk(struct snd_soc_dai *dai,
int clk_id, unsigned int freq, int dir)
diff --git a/asoc/codecs/sdm660_cdc/sdm660-regmap.c b/asoc/codecs/sdm660_cdc/msm-digital-cdc-regmap.c
similarity index 72%
rename from asoc/codecs/sdm660_cdc/sdm660-regmap.c
rename to asoc/codecs/sdm660_cdc/msm-digital-cdc-regmap.c
index 7d8ac6d..a626791 100644
--- a/asoc/codecs/sdm660_cdc/sdm660-regmap.c
+++ b/asoc/codecs/sdm660_cdc/msm-digital-cdc-regmap.c
@@ -154,165 +154,6 @@
{MSM89XX_CDC_CORE_TX4_DMIC_CTL, 0x00},
};
-struct reg_default
- msm89xx_pmic_cdc_defaults[MSM89XX_PMIC_CDC_CACHE_SIZE] = {
- {MSM89XX_PMIC_DIGITAL_REVISION1, 0x00},
- {MSM89XX_PMIC_DIGITAL_REVISION2, 0x00},
- {MSM89XX_PMIC_DIGITAL_PERPH_TYPE, 0x23},
- {MSM89XX_PMIC_DIGITAL_PERPH_SUBTYPE, 0x01},
- {MSM89XX_PMIC_DIGITAL_INT_RT_STS, 0x00},
- {MSM89XX_PMIC_DIGITAL_INT_SET_TYPE, 0xFF},
- {MSM89XX_PMIC_DIGITAL_INT_POLARITY_HIGH, 0xFF},
- {MSM89XX_PMIC_DIGITAL_INT_POLARITY_LOW, 0x00},
- {MSM89XX_PMIC_DIGITAL_INT_LATCHED_CLR, 0x00},
- {MSM89XX_PMIC_DIGITAL_INT_EN_SET, 0x00},
- {MSM89XX_PMIC_DIGITAL_INT_EN_CLR, 0x00},
- {MSM89XX_PMIC_DIGITAL_INT_LATCHED_STS, 0x00},
- {MSM89XX_PMIC_DIGITAL_INT_PENDING_STS, 0x00},
- {MSM89XX_PMIC_DIGITAL_INT_MID_SEL, 0x00},
- {MSM89XX_PMIC_DIGITAL_INT_PRIORITY, 0x00},
- {MSM89XX_PMIC_DIGITAL_GPIO_MODE, 0x00},
- {MSM89XX_PMIC_DIGITAL_PIN_CTL_OE, 0x01},
- {MSM89XX_PMIC_DIGITAL_PIN_CTL_DATA, 0x00},
- {MSM89XX_PMIC_DIGITAL_PIN_STATUS, 0x00},
- {MSM89XX_PMIC_DIGITAL_HDRIVE_CTL, 0x00},
- {MSM89XX_PMIC_DIGITAL_CDC_RST_CTL, 0x00},
- {MSM89XX_PMIC_DIGITAL_CDC_TOP_CLK_CTL, 0x00},
- {MSM89XX_PMIC_DIGITAL_CDC_ANA_CLK_CTL, 0x00},
- {MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, 0x00},
- {MSM89XX_PMIC_DIGITAL_CDC_CONN_TX1_CTL, 0x02},
- {MSM89XX_PMIC_DIGITAL_CDC_CONN_TX2_CTL, 0x02},
- {MSM89XX_PMIC_DIGITAL_CDC_CONN_HPHR_DAC_CTL, 0x00},
- {MSM89XX_PMIC_DIGITAL_CDC_CONN_RX1_CTL, 0x00},
- {MSM89XX_PMIC_DIGITAL_CDC_CONN_RX2_CTL, 0x00},
- {MSM89XX_PMIC_DIGITAL_CDC_CONN_RX3_CTL, 0x00},
- {MSM89XX_PMIC_DIGITAL_CDC_CONN_RX_LB_CTL, 0x00},
- {MSM89XX_PMIC_DIGITAL_CDC_RX_CTL1, 0x7C},
- {MSM89XX_PMIC_DIGITAL_CDC_RX_CTL2, 0x7C},
- {MSM89XX_PMIC_DIGITAL_CDC_RX_CTL3, 0x7C},
- {MSM89XX_PMIC_DIGITAL_DEM_BYPASS_DATA0, 0x00},
- {MSM89XX_PMIC_DIGITAL_DEM_BYPASS_DATA1, 0x00},
- {MSM89XX_PMIC_DIGITAL_DEM_BYPASS_DATA2, 0x00},
- {MSM89XX_PMIC_DIGITAL_DEM_BYPASS_DATA3, 0x00},
- {MSM89XX_PMIC_DIGITAL_DIG_DEBUG_CTL, 0x00},
- {MSM89XX_PMIC_DIGITAL_DIG_DEBUG_EN, 0x00},
- {MSM89XX_PMIC_DIGITAL_SPARE_0, 0x00},
- {MSM89XX_PMIC_DIGITAL_SPARE_1, 0x00},
- {MSM89XX_PMIC_DIGITAL_SPARE_2, 0x00},
- {MSM89XX_PMIC_DIGITAL_SEC_ACCESS, 0x00},
- {MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL1, 0x00},
- {MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL2, 0x02},
- {MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL3, 0x05},
- {MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL4, 0x00},
- {MSM89XX_PMIC_DIGITAL_INT_TEST1, 0x00},
- {MSM89XX_PMIC_DIGITAL_INT_TEST_VAL, 0x00},
- {MSM89XX_PMIC_DIGITAL_TRIM_NUM, 0x00},
- {MSM89XX_PMIC_DIGITAL_TRIM_CTRL, 0x00},
- {MSM89XX_PMIC_ANALOG_REVISION1, 0x00},
- {MSM89XX_PMIC_ANALOG_REVISION2, 0x00},
- {MSM89XX_PMIC_ANALOG_REVISION3, 0x00},
- {MSM89XX_PMIC_ANALOG_REVISION4, 0x00},
- {MSM89XX_PMIC_ANALOG_PERPH_TYPE, 0x23},
- {MSM89XX_PMIC_ANALOG_PERPH_SUBTYPE, 0x09},
- {MSM89XX_PMIC_ANALOG_INT_RT_STS, 0x00},
- {MSM89XX_PMIC_ANALOG_INT_SET_TYPE, 0x3F},
- {MSM89XX_PMIC_ANALOG_INT_POLARITY_HIGH, 0x3F},
- {MSM89XX_PMIC_ANALOG_INT_POLARITY_LOW, 0x00},
- {MSM89XX_PMIC_ANALOG_INT_LATCHED_CLR, 0x00},
- {MSM89XX_PMIC_ANALOG_INT_EN_SET, 0x00},
- {MSM89XX_PMIC_ANALOG_INT_EN_CLR, 0x00},
- {MSM89XX_PMIC_ANALOG_INT_LATCHED_STS, 0x00},
- {MSM89XX_PMIC_ANALOG_INT_PENDING_STS, 0x00},
- {MSM89XX_PMIC_ANALOG_INT_MID_SEL, 0x00},
- {MSM89XX_PMIC_ANALOG_INT_PRIORITY, 0x00},
- {MSM89XX_PMIC_ANALOG_MICB_1_EN, 0x00},
- {MSM89XX_PMIC_ANALOG_MICB_1_VAL, 0x20},
- {MSM89XX_PMIC_ANALOG_MICB_1_CTL, 0x00},
- {MSM89XX_PMIC_ANALOG_MICB_1_INT_RBIAS, 0x49},
- {MSM89XX_PMIC_ANALOG_MICB_2_EN, 0x20},
- {MSM89XX_PMIC_ANALOG_TX_1_2_ATEST_CTL_2, 0x00},
- {MSM89XX_PMIC_ANALOG_MASTER_BIAS_CTL, 0x00},
- {MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_1, 0x35},
- {MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_2, 0x08},
- {MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL, 0x00},
- {MSM89XX_PMIC_ANALOG_MBHC_DBNC_TIMER, 0x98},
- {MSM89XX_PMIC_ANALOG_MBHC_BTN0_ZDETL_CTL, 0x00},
- {MSM89XX_PMIC_ANALOG_MBHC_BTN1_ZDETM_CTL, 0x20},
- {MSM89XX_PMIC_ANALOG_MBHC_BTN2_ZDETH_CTL, 0x40},
- {MSM89XX_PMIC_ANALOG_MBHC_BTN3_CTL, 0x61},
- {MSM89XX_PMIC_ANALOG_MBHC_BTN4_CTL, 0x80},
- {MSM89XX_PMIC_ANALOG_MBHC_BTN_RESULT, 0x00},
- {MSM89XX_PMIC_ANALOG_MBHC_ZDET_ELECT_RESULT, 0x00},
- {MSM89XX_PMIC_ANALOG_TX_1_EN, 0x03},
- {MSM89XX_PMIC_ANALOG_TX_2_EN, 0x03},
- {MSM89XX_PMIC_ANALOG_TX_1_2_TEST_CTL_1, 0xBF},
- {MSM89XX_PMIC_ANALOG_TX_1_2_TEST_CTL_2, 0x8C},
- {MSM89XX_PMIC_ANALOG_TX_1_2_ATEST_CTL, 0x00},
- {MSM89XX_PMIC_ANALOG_TX_1_2_OPAMP_BIAS, 0x6B},
- {MSM89XX_PMIC_ANALOG_TX_1_2_TXFE_CLKDIV, 0x51},
- {MSM89XX_PMIC_ANALOG_TX_3_EN, 0x02},
- {MSM89XX_PMIC_ANALOG_NCP_EN, 0x26},
- {MSM89XX_PMIC_ANALOG_NCP_CLK, 0x23},
- {MSM89XX_PMIC_ANALOG_NCP_DEGLITCH, 0x5B},
- {MSM89XX_PMIC_ANALOG_NCP_FBCTRL, 0x08},
- {MSM89XX_PMIC_ANALOG_NCP_BIAS, 0x29},
- {MSM89XX_PMIC_ANALOG_NCP_VCTRL, 0x24},
- {MSM89XX_PMIC_ANALOG_NCP_TEST, 0x00},
- {MSM89XX_PMIC_ANALOG_NCP_CLIM_ADDR, 0xD5},
- {MSM89XX_PMIC_ANALOG_RX_CLOCK_DIVIDER, 0xE8},
- {MSM89XX_PMIC_ANALOG_RX_COM_OCP_CTL, 0xCF},
- {MSM89XX_PMIC_ANALOG_RX_COM_OCP_COUNT, 0x6E},
- {MSM89XX_PMIC_ANALOG_RX_COM_BIAS_DAC, 0x18},
- {MSM89XX_PMIC_ANALOG_RX_HPH_BIAS_PA, 0x5A},
- {MSM89XX_PMIC_ANALOG_RX_HPH_BIAS_LDO_OCP, 0x69},
- {MSM89XX_PMIC_ANALOG_RX_HPH_BIAS_CNP, 0x29},
- {MSM89XX_PMIC_ANALOG_RX_HPH_CNP_EN, 0x80},
- {MSM89XX_PMIC_ANALOG_RX_HPH_CNP_WG_CTL, 0xDA},
- {MSM89XX_PMIC_ANALOG_RX_HPH_CNP_WG_TIME, 0x16},
- {MSM89XX_PMIC_ANALOG_RX_HPH_L_TEST, 0x00},
- {MSM89XX_PMIC_ANALOG_RX_HPH_L_PA_DAC_CTL, 0x20},
- {MSM89XX_PMIC_ANALOG_RX_HPH_R_TEST, 0x00},
- {MSM89XX_PMIC_ANALOG_RX_HPH_R_PA_DAC_CTL, 0x20},
- {MSM89XX_PMIC_ANALOG_RX_EAR_CTL, 0x12},
- {MSM89XX_PMIC_ANALOG_RX_ATEST, 0x00},
- {MSM89XX_PMIC_ANALOG_RX_HPH_STATUS, 0x0C},
- {MSM89XX_PMIC_ANALOG_RX_EAR_STATUS, 0x00},
- {MSM89XX_PMIC_ANALOG_RX_LO_DAC_CTL, 0x00},
- {MSM89XX_PMIC_ANALOG_RX_LO_EN_CTL, 0x00},
- {MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL, 0x83},
- {MSM89XX_PMIC_ANALOG_SPKR_DRV_CLIP_DET, 0x91},
- {MSM89XX_PMIC_ANALOG_SPKR_DRV_CTL, 0x29},
- {MSM89XX_PMIC_ANALOG_SPKR_ANA_BIAS_SET, 0x4D},
- {MSM89XX_PMIC_ANALOG_SPKR_OCP_CTL, 0xE1},
- {MSM89XX_PMIC_ANALOG_SPKR_PWRSTG_CTL, 0x1E},
- {MSM89XX_PMIC_ANALOG_SPKR_DRV_MISC, 0xCB},
- {MSM89XX_PMIC_ANALOG_SPKR_DRV_DBG, 0x00},
- {MSM89XX_PMIC_ANALOG_CURRENT_LIMIT, 0x02},
- {MSM89XX_PMIC_ANALOG_OUTPUT_VOLTAGE, 0x14},
- {MSM89XX_PMIC_ANALOG_BYPASS_MODE, 0x00},
- {MSM89XX_PMIC_ANALOG_BOOST_EN_CTL, 0x1F},
- {MSM89XX_PMIC_ANALOG_SLOPE_COMP_IP_ZERO, 0x8C},
- {MSM89XX_PMIC_ANALOG_RDSON_MAX_DUTY_CYCLE, 0xC0},
- {MSM89XX_PMIC_ANALOG_BOOST_TEST1_1, 0x00},
- {MSM89XX_PMIC_ANALOG_BOOST_TEST_2, 0x00},
- {MSM89XX_PMIC_ANALOG_SPKR_SAR_STATUS, 0x00},
- {MSM89XX_PMIC_ANALOG_SPKR_DRV_STATUS, 0x00},
- {MSM89XX_PMIC_ANALOG_PBUS_ADD_CSR, 0x00},
- {MSM89XX_PMIC_ANALOG_PBUS_ADD_SEL, 0x00},
- {MSM89XX_PMIC_ANALOG_SEC_ACCESS, 0x00},
- {MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL1, 0x00},
- {MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL2, 0x01},
- {MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL3, 0x05},
- {MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL4, 0x00},
- {MSM89XX_PMIC_ANALOG_INT_TEST1, 0x00},
- {MSM89XX_PMIC_ANALOG_INT_TEST_VAL, 0x00},
- {MSM89XX_PMIC_ANALOG_TRIM_NUM, 0x04},
- {MSM89XX_PMIC_ANALOG_TRIM_CTRL1, 0x00},
- {MSM89XX_PMIC_ANALOG_TRIM_CTRL2, 0x00},
- {MSM89XX_PMIC_ANALOG_TRIM_CTRL3, 0x00},
- {MSM89XX_PMIC_ANALOG_TRIM_CTRL4, 0x00},
-};
-
static const u8 msm89xx_cdc_core_reg_readable[MSM89XX_CDC_CORE_CACHE_SIZE] = {
[MSM89XX_CDC_CORE_CLK_RX_RESET_CTL] = 1,
[MSM89XX_CDC_CORE_CLK_TX_RESET_B1_CTL] = 1,
diff --git a/asoc/codecs/wcd-mbhc-adc.c b/asoc/codecs/wcd-mbhc-adc.c
index e44eec9..bcb616e 100644
--- a/asoc/codecs/wcd-mbhc-adc.c
+++ b/asoc/codecs/wcd-mbhc-adc.c
@@ -370,11 +370,18 @@
* btn press/relesae for HEADSET type during correct work.
*/
output_mv = wcd_measure_adc_once(mbhc, MUX_CTL_IN2P);
- adc_threshold = ((WCD_MBHC_ADC_HS_THRESHOLD_MV *
+ if (mbhc->hs_thr)
+ adc_threshold = mbhc->hs_thr;
+ else
+ adc_threshold = ((WCD_MBHC_ADC_HS_THRESHOLD_MV *
wcd_mbhc_get_micbias(mbhc))/WCD_MBHC_ADC_MICBIAS_MV);
- adc_hph_threshold = ((WCD_MBHC_ADC_HPH_THRESHOLD_MV *
- wcd_mbhc_get_micbias(mbhc))/
- WCD_MBHC_ADC_MICBIAS_MV);
+
+ if (mbhc->hph_thr)
+ adc_hph_threshold = mbhc->hph_thr;
+ else
+ adc_hph_threshold = ((WCD_MBHC_ADC_HPH_THRESHOLD_MV *
+ wcd_mbhc_get_micbias(mbhc))/
+ WCD_MBHC_ADC_MICBIAS_MV);
if (output_mv > adc_threshold || output_mv < adc_hph_threshold) {
spl_hs = false;
@@ -426,8 +433,10 @@
return false;
}
}
-
- adc_threshold = ((WCD_MBHC_ADC_HS_THRESHOLD_MV *
+ if (mbhc->hs_thr)
+ adc_threshold = mbhc->hs_thr;
+ else
+ adc_threshold = ((WCD_MBHC_ADC_HS_THRESHOLD_MV *
wcd_mbhc_get_micbias(mbhc)) /
WCD_MBHC_ADC_MICBIAS_MV);
@@ -556,14 +565,25 @@
}
}
-static int wcd_mbhc_get_plug_from_adc(int adc_result)
+static int wcd_mbhc_get_plug_from_adc(struct wcd_mbhc *mbhc, int adc_result)
{
enum wcd_mbhc_plug_type plug_type = MBHC_PLUG_TYPE_INVALID;
+ u32 hph_thr = 0, hs_thr = 0;
- if (adc_result < WCD_MBHC_ADC_HPH_THRESHOLD_MV)
+ if (mbhc->hs_thr)
+ hs_thr = mbhc->hs_thr;
+ else
+ hs_thr = WCD_MBHC_ADC_HS_THRESHOLD_MV;
+
+ if (mbhc->hph_thr)
+ hph_thr = mbhc->hph_thr;
+ else
+ hph_thr = WCD_MBHC_ADC_HPH_THRESHOLD_MV;
+
+ if (adc_result < hph_thr)
plug_type = MBHC_PLUG_TYPE_HEADPHONE;
- else if (adc_result > WCD_MBHC_ADC_HS_THRESHOLD_MV)
+ else if (adc_result > hs_thr)
plug_type = MBHC_PLUG_TYPE_HIGH_HPH;
else
plug_type = MBHC_PLUG_TYPE_HEADSET;
@@ -612,7 +632,7 @@
}
/* Find plug type */
output_mv = wcd_measure_adc_continuous(mbhc);
- plug_type = wcd_mbhc_get_plug_from_adc(output_mv);
+ plug_type = wcd_mbhc_get_plug_from_adc(mbhc, output_mv);
/*
* Report plug type if it is either headset or headphone
@@ -667,7 +687,7 @@
* instead of hogging system by contineous polling, wait for
* sometime and re-check stop request again.
*/
- plug_type = wcd_mbhc_get_plug_from_adc(output_mv);
+ plug_type = wcd_mbhc_get_plug_from_adc(mbhc, output_mv);
if ((output_mv > WCD_MBHC_ADC_HS_THRESHOLD_MV) &&
(spl_hs_count < WCD_MBHC_SPL_HS_CNT)) {
@@ -713,7 +733,7 @@
no_gnd_mic_swap_cnt++;
pt_gnd_mic_swap_cnt = 0;
plug_type = wcd_mbhc_get_plug_from_adc(
- output_mv);
+ mbhc, output_mv);
if ((no_gnd_mic_swap_cnt <
GND_MIC_SWAP_THRESHOLD) &&
(spl_hs_count != WCD_MBHC_SPL_HS_CNT)) {
@@ -747,7 +767,7 @@
plug_type);
if (plug_type != MBHC_PLUG_TYPE_GND_MIC_SWAP) {
plug_type = wcd_mbhc_get_plug_from_adc(
- output_mv);
+ mbhc, output_mv);
if (!spl_hs_reported &&
spl_hs_count == WCD_MBHC_SPL_HS_CNT) {
spl_hs_reported = true;
@@ -895,6 +915,8 @@
struct wcd_mbhc *mbhc = data;
unsigned long timeout;
int adc_threshold, output_mv, retry = 0;
+ bool hphpa_on = false;
+ u8 moisture_status = 0;
pr_debug("%s: enter\n", __func__);
WCD_MBHC_RSC_LOCK(mbhc);
@@ -928,17 +950,59 @@
goto exit;
}
- /*
- * ADC COMPLETE and ELEC_REM interrupts are both enabled for HEADPHONE,
- * need to reject the ADC COMPLETE interrupt which follows ELEC_REM one
- * when HEADPHONE is removed.
- */
- if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADPHONE)
- mbhc->extn_cable_hph_rem = true;
- WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_DETECTION_DONE, 0);
- WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_MODE, 0);
- WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_EN, 0);
- wcd_mbhc_elec_hs_report_unplug(mbhc);
+ if (mbhc->mbhc_cfg->moisture_en) {
+ if (mbhc->mbhc_cb->hph_pa_on_status)
+ if (mbhc->mbhc_cb->hph_pa_on_status(mbhc->codec)) {
+ hphpa_on = true;
+ WCD_MBHC_REG_UPDATE_BITS(
+ WCD_MBHC_HPHL_PA_EN, 0);
+ WCD_MBHC_REG_UPDATE_BITS(
+ WCD_MBHC_HPH_PA_EN, 0);
+ }
+ WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHR_GND, 1);
+ WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHL_GND, 1);
+ /* wait for 50ms to get moisture status */
+ usleep_range(50000, 50100);
+
+ WCD_MBHC_REG_READ(WCD_MBHC_MOISTURE_STATUS, moisture_status);
+ }
+
+ if (mbhc->mbhc_cfg->moisture_en && !moisture_status) {
+ pr_debug("%s: moisture present in jack\n", __func__);
+ WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 0);
+ WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MECH_DETECTION_TYPE, 1);
+ WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 1);
+ WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0);
+ WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 0);
+ mbhc->btn_press_intr = false;
+ mbhc->is_btn_press = false;
+ if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADSET)
+ wcd_mbhc_report_plug(mbhc, 0, SND_JACK_HEADSET);
+ else if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADPHONE)
+ wcd_mbhc_report_plug(mbhc, 0, SND_JACK_HEADPHONE);
+ else if (mbhc->current_plug == MBHC_PLUG_TYPE_GND_MIC_SWAP)
+ wcd_mbhc_report_plug(mbhc, 0, SND_JACK_UNSUPPORTED);
+ else if (mbhc->current_plug == MBHC_PLUG_TYPE_HIGH_HPH)
+ wcd_mbhc_report_plug(mbhc, 0, SND_JACK_LINEOUT);
+ } else {
+ /*
+ * ADC COMPLETE and ELEC_REM interrupts are both enabled for
+ * HEADPHONE, need to reject the ADC COMPLETE interrupt which
+ * follows ELEC_REM one when HEADPHONE is removed.
+ */
+ if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADPHONE)
+ mbhc->extn_cable_hph_rem = true;
+ WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_DETECTION_DONE, 0);
+ WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_MODE, 0);
+ WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ADC_EN, 0);
+ wcd_mbhc_elec_hs_report_unplug(mbhc);
+
+ if (hphpa_on) {
+ hphpa_on = false;
+ WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHL_PA_EN, 1);
+ WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPH_PA_EN, 1);
+ }
+ }
exit:
WCD_MBHC_RSC_UNLOCK(mbhc);
pr_debug("%s: leave\n", __func__);
diff --git a/asoc/codecs/wcd-mbhc-legacy.c b/asoc/codecs/wcd-mbhc-legacy.c
index 745e2e8..a72f64b 100644
--- a/asoc/codecs/wcd-mbhc-legacy.c
+++ b/asoc/codecs/wcd-mbhc-legacy.c
@@ -794,6 +794,8 @@
unsigned long timeout;
bool removed = true;
int retry = 0;
+ bool hphpa_on = false;
+ u8 moisture_status = 0;
pr_debug("%s: enter\n", __func__);
@@ -830,29 +832,78 @@
WCD_MBHC_REG_READ(WCD_MBHC_HS_COMP_RESULT, hs_comp_result);
if (removed) {
- if (!(hphl_sch && mic_sch && hs_comp_result)) {
- /*
- * extension cable is still plugged in
- * report it as LINEOUT device
- */
- goto report_unplug;
+ if (mbhc->mbhc_cfg->moisture_en) {
+ if (mbhc->mbhc_cb->hph_pa_on_status)
+ if (
+ mbhc->mbhc_cb->hph_pa_on_status(mbhc->codec)) {
+ hphpa_on = true;
+ WCD_MBHC_REG_UPDATE_BITS(
+ WCD_MBHC_HPHL_PA_EN, 0);
+ WCD_MBHC_REG_UPDATE_BITS(
+ WCD_MBHC_HPH_PA_EN, 0);
+ }
+
+ WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHR_GND, 1);
+ WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHL_GND, 1);
+ /* wait for 50ms to get moisture status */
+ usleep_range(50000, 50100);
+
+ WCD_MBHC_REG_READ(
+ WCD_MBHC_MOISTURE_STATUS, moisture_status);
+ }
+
+ if (mbhc->mbhc_cfg->moisture_en && !moisture_status) {
+ pr_debug("%s: moisture present in jack\n", __func__);
+ WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 0);
+ WCD_MBHC_REG_UPDATE_BITS(
+ WCD_MBHC_MECH_DETECTION_TYPE, 1);
+ WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_L_DET_EN, 1);
+ WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0);
+ WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 0);
+ mbhc->btn_press_intr = false;
+ mbhc->is_btn_press = false;
+ if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADSET)
+ wcd_mbhc_report_plug(
+ mbhc, 0, SND_JACK_HEADSET);
+ else if (mbhc->current_plug ==
+ MBHC_PLUG_TYPE_HEADPHONE)
+ wcd_mbhc_report_plug(
+ mbhc, 0, SND_JACK_HEADPHONE);
+ else if (mbhc->current_plug ==
+ MBHC_PLUG_TYPE_GND_MIC_SWAP)
+ wcd_mbhc_report_plug(
+ mbhc, 0, SND_JACK_UNSUPPORTED);
+ else if (mbhc->current_plug ==
+ MBHC_PLUG_TYPE_HIGH_HPH)
+ wcd_mbhc_report_plug(
+ mbhc, 0, SND_JACK_LINEOUT);
} else {
- if (!mic_sch) {
- mic_trigerred++;
- pr_debug("%s: Removal MIC trigerred %d\n",
- __func__, mic_trigerred);
- }
- if (!hphl_sch) {
- hphl_trigerred++;
- pr_debug("%s: Removal HPHL trigerred %d\n",
- __func__, hphl_trigerred);
- }
- if (mic_trigerred && hphl_trigerred) {
+ if (!(hphl_sch && mic_sch && hs_comp_result)) {
/*
* extension cable is still plugged in
* report it as LINEOUT device
*/
goto report_unplug;
+ } else {
+ if (!mic_sch) {
+ mic_trigerred++;
+ pr_debug(
+ "%s: Removal MIC trigerred %d\n",
+ __func__, mic_trigerred);
+ }
+ if (!hphl_sch) {
+ hphl_trigerred++;
+ pr_debug(
+ "%s: Removal HPHL trigerred %d\n",
+ __func__, hphl_trigerred);
+ }
+ if (mic_trigerred && hphl_trigerred) {
+ /*
+ * extension cable is still plugged in
+ * report it as LINEOUT device
+ */
+ goto report_unplug;
+ }
}
}
}
@@ -863,6 +914,11 @@
report_unplug:
wcd_mbhc_elec_hs_report_unplug(mbhc);
+ if (hphpa_on) {
+ hphpa_on = false;
+ WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPHL_PA_EN, 1);
+ WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_HPH_PA_EN, 1);
+ }
hphl_trigerred = 0;
mic_trigerred = 0;
WCD_MBHC_RSC_UNLOCK(mbhc);
diff --git a/asoc/codecs/wcd-mbhc-v2.c b/asoc/codecs/wcd-mbhc-v2.c
index 6b3dd86..d7c5921 100644
--- a/asoc/codecs/wcd-mbhc-v2.c
+++ b/asoc/codecs/wcd-mbhc-v2.c
@@ -550,7 +550,7 @@
}
EXPORT_SYMBOL(wcd_mbhc_hs_elec_irq);
-static void wcd_mbhc_report_plug(struct wcd_mbhc *mbhc, int insertion,
+void wcd_mbhc_report_plug(struct wcd_mbhc *mbhc, int insertion,
enum snd_jack_types jack_type)
{
struct snd_soc_codec *codec = mbhc->codec;
@@ -725,6 +725,7 @@
}
pr_debug("%s: leave hph_status %x\n", __func__, mbhc->hph_status);
}
+EXPORT_SYMBOL(wcd_mbhc_report_plug);
void wcd_mbhc_elec_hs_report_unplug(struct wcd_mbhc *mbhc)
{
@@ -1838,6 +1839,8 @@
struct snd_soc_card *card = codec->component.card;
const char *hph_switch = "qcom,msm-mbhc-hphl-swh";
const char *gnd_switch = "qcom,msm-mbhc-gnd-swh";
+ const char *hs_thre = "qcom,msm-mbhc-hs-mic-max-threshold-mv";
+ const char *hph_thre = "qcom,msm-mbhc-hs-mic-min-threshold-mv";
pr_debug("%s: enter\n", __func__);
@@ -1855,6 +1858,18 @@
goto err;
}
+ ret = of_property_read_u32(card->dev->of_node, hs_thre,
+ &(mbhc->hs_thr));
+ if (ret)
+ dev_dbg(card->dev,
+ "%s: missing %s in dt node\n", __func__, hs_thre);
+
+ ret = of_property_read_u32(card->dev->of_node, hph_thre,
+ &(mbhc->hph_thr));
+ if (ret)
+ dev_dbg(card->dev,
+ "%s: missing %s in dt node\n", __func__, hph_thre);
+
ret = of_property_read_u32_array(card->dev->of_node,
"qcom,msm-mbhc-moist-cfg",
hph_moist_config, 3);
diff --git a/asoc/codecs/wcd-mbhc-v2.h b/asoc/codecs/wcd-mbhc-v2.h
index c8714fc..0c57eee 100644
--- a/asoc/codecs/wcd-mbhc-v2.h
+++ b/asoc/codecs/wcd-mbhc-v2.h
@@ -16,6 +16,7 @@
#include <linux/stringify.h>
#include <linux/power_supply.h>
#include "wcdcal-hwdep.h"
+#include <sound/jack.h>
#define TOMBAK_MBHC_NC 0
#define TOMBAK_MBHC_NO 1
@@ -204,6 +205,9 @@
WCD_MBHC_ANC_DET_EN,
WCD_MBHC_FSM_STATUS,
WCD_MBHC_MUX_CTL,
+ WCD_MBHC_MOISTURE_STATUS,
+ WCD_MBHC_HPHR_GND,
+ WCD_MBHC_HPHL_GND,
WCD_MBHC_HPHL_OCP_DET_EN,
WCD_MBHC_HPHR_OCP_DET_EN,
WCD_MBHC_HPHL_OCP_STATUS,
@@ -518,6 +522,8 @@
bool in_swch_irq_handler;
bool hphl_swh; /*track HPHL switch NC / NO */
bool gnd_swh; /*track GND switch NC / NO */
+ u32 hs_thr;
+ u32 hph_thr;
u32 moist_vref;
u32 moist_iref;
u32 moist_rref;
@@ -594,5 +600,7 @@
struct snd_soc_jack *jack, int status, int mask);
int wcd_cancel_btn_work(struct wcd_mbhc *mbhc);
int wcd_mbhc_get_button_mask(struct wcd_mbhc *mbhc);
+void wcd_mbhc_report_plug(struct wcd_mbhc *mbhc, int insertion,
+ enum snd_jack_types jack_type);
#endif /* __WCD_MBHC_V2_H__ */
diff --git a/asoc/codecs/wcd9335.c b/asoc/codecs/wcd9335.c
index 21de9f5..19877b9 100644
--- a/asoc/codecs/wcd9335.c
+++ b/asoc/codecs/wcd9335.c
@@ -650,6 +650,12 @@
0, 0, 0, 0),
WCD_MBHC_REGISTER("WCD_MBHC_MUX_CTL",
WCD9335_MBHC_CTL_2, 0x70, 4, 0),
+ WCD_MBHC_REGISTER("WCD_MBHC_MOISTURE_STATUS",
+ WCD9335_MBHC_FSM_STATUS, 0X20, 5, 0),
+ WCD_MBHC_REGISTER("WCD_MBHC_HPHR_GND",
+ WCD9335_HPH_PA_CTL2, 0x40, 6, 0),
+ WCD_MBHC_REGISTER("WCD_MBHC_HPHL_GND",
+ WCD9335_HPH_PA_CTL2, 0x10, 4, 0),
};
static const struct wcd_mbhc_intr intr_ids = {
diff --git a/asoc/codecs/wcd934x/wcd934x-mbhc.c b/asoc/codecs/wcd934x/wcd934x-mbhc.c
index 4eb14de..807d4ea 100644
--- a/asoc/codecs/wcd934x/wcd934x-mbhc.c
+++ b/asoc/codecs/wcd934x/wcd934x-mbhc.c
@@ -120,6 +120,12 @@
WCD934X_MBHC_STATUS_SPARE_1, 0x01, 0, 0),
WCD_MBHC_REGISTER("WCD_MBHC_MUX_CTL",
WCD934X_MBHC_NEW_CTL_2, 0x70, 4, 0),
+ WCD_MBHC_REGISTER("WCD_MBHC_MOISTURE_STATUS",
+ WCD934X_MBHC_NEW_FSM_STATUS, 0x20, 5, 0),
+ WCD_MBHC_REGISTER("WCD_MBHC_HPHR_GND",
+ WCD934X_HPH_PA_CTL2, 0x40, 6, 0),
+ WCD_MBHC_REGISTER("WCD_MBHC_HPHL_GND",
+ WCD934X_HPH_PA_CTL2, 0x10, 4, 0),
WCD_MBHC_REGISTER("WCD_MBHC_HPHL_OCP_DET_EN",
WCD934X_HPH_L_TEST, 0x01, 0, 0),
WCD_MBHC_REGISTER("WCD_MBHC_HPHR_OCP_DET_EN",
diff --git a/asoc/codecs/wcd934x/wcd934x.c b/asoc/codecs/wcd934x/wcd934x.c
index 66c7830..7fd1e63 100644
--- a/asoc/codecs/wcd934x/wcd934x.c
+++ b/asoc/codecs/wcd934x/wcd934x.c
@@ -8633,6 +8633,10 @@
{WCD934X_TLMM_DMIC3_DATA_PINCFG, 0xFF, 0x0a},
{WCD934X_CPE_SS_SVA_CFG, 0x60, 0x00},
{WCD934X_CPE_SS_CPAR_CFG, 0x10, 0x10},
+ {WCD934X_MICB1_TEST_CTL_1, 0xff, 0xfa},
+ {WCD934X_MICB2_TEST_CTL_1, 0xff, 0xfa},
+ {WCD934X_MICB3_TEST_CTL_1, 0xff, 0xfa},
+ {WCD934X_MICB4_TEST_CTL_1, 0xff, 0xfa},
};
static void tavil_codec_init_reg(struct tavil_priv *priv)
diff --git a/asoc/msm-pcm-routing-v2.c b/asoc/msm-pcm-routing-v2.c
index 6011926..3338ac6 100644
--- a/asoc/msm-pcm-routing-v2.c
+++ b/asoc/msm-pcm-routing-v2.c
@@ -16533,7 +16533,7 @@
{"QUIN_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"QUIN_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"QUIN_TDM_RX_0 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
- {"QUIN_TDM_RX_0", NULL, "QUAT_TDM_RX_0 Port Mixer"},
+ {"QUIN_TDM_RX_0", NULL, "QUIN_TDM_RX_0 Port Mixer"},
{"QUIN_TDM_RX_1 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
{"QUIN_TDM_RX_1 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"},
@@ -16555,7 +16555,7 @@
{"QUIN_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"QUIN_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"QUIN_TDM_RX_1 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
- {"QUIN_TDM_RX_1", NULL, "QUAT_TDM_RX_1 Port Mixer"},
+ {"QUIN_TDM_RX_1", NULL, "QUIN_TDM_RX_1 Port Mixer"},
{"QUIN_TDM_RX_2 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
{"QUIN_TDM_RX_2 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"},
@@ -16577,7 +16577,7 @@
{"QUIN_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"QUIN_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"QUIN_TDM_RX_2 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
- {"QUIN_TDM_RX_2", NULL, "QUAT_TDM_RX_2 Port Mixer"},
+ {"QUIN_TDM_RX_2", NULL, "QUIN_TDM_RX_2 Port Mixer"},
{"QUIN_TDM_RX_3 Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
{"QUIN_TDM_RX_3 Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"},
@@ -16599,7 +16599,7 @@
{"QUIN_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"},
{"QUIN_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"},
{"QUIN_TDM_RX_3 Port Mixer", "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"},
- {"QUIN_TDM_RX_3", NULL, "QUAT_TDM_RX_3 Port Mixer"},
+ {"QUIN_TDM_RX_3", NULL, "QUIN_TDM_RX_3 Port Mixer"},
{"INT0_MI2S_RX Port Mixer", "PRI_MI2S_TX", "PRI_MI2S_TX"},
{"INT0_MI2S_RX Port Mixer", "SEC_MI2S_TX", "SEC_MI2S_TX"},
diff --git a/asoc/msm-pcm-routing-v2.h b/asoc/msm-pcm-routing-v2.h
index 479ba35..8f91e4f 100644
--- a/asoc/msm-pcm-routing-v2.h
+++ b/asoc/msm-pcm-routing-v2.h
@@ -58,8 +58,8 @@
#define LPASS_BE_SEC_MI2S_TX "SEC_MI2S_TX"
#define LPASS_BE_PRI_MI2S_RX "PRI_MI2S_RX"
#define LPASS_BE_PRI_MI2S_TX "PRI_MI2S_TX"
-#define LPASS_BE_TERT_MI2S_RX "TERTIARY_MI2S_RX"
-#define LPASS_BE_TERT_MI2S_TX "TERTIARY_MI2S_TX"
+#define LPASS_BE_TERT_MI2S_RX "TERT_MI2S_RX"
+#define LPASS_BE_TERT_MI2S_TX "TERT_MI2S_TX"
#define LPASS_BE_AUDIO_I2S_RX "AUDIO_I2S_RX"
#define LPASS_BE_STUB_RX "STUB_RX"
#define LPASS_BE_STUB_TX "STUB_TX"
diff --git a/asoc/sdm660-common.c b/asoc/sdm660-common.c
index 78218ab..e6b82df 100644
--- a/asoc/sdm660-common.c
+++ b/asoc/sdm660-common.c
@@ -171,15 +171,6 @@
};
enum {
- PRIM_MI2S = 0,
- SEC_MI2S,
- TERT_MI2S,
- QUAT_MI2S,
- QUIN_MI2S,
- MI2S_MAX,
-};
-
-enum {
PRIM_AUX_PCM = 0,
SEC_AUX_PCM,
TERT_AUX_PCM,
@@ -208,7 +199,8 @@
Q6AFE_LPASS_CLK_ID_PRI_MI2S_EBIT,
Q6AFE_LPASS_CLK_ID_SEC_MI2S_EBIT,
Q6AFE_LPASS_CLK_ID_TER_MI2S_EBIT,
- Q6AFE_LPASS_CLK_ID_QUAD_MI2S_EBIT
+ Q6AFE_LPASS_CLK_ID_QUAD_MI2S_EBIT,
+ Q6AFE_LPASS_CLK_ID_QUI_MI2S_EBIT
};
struct msm_wsa881x_dev_info {
@@ -401,6 +393,14 @@
Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
Q6AFE_LPASS_CLK_ROOT_DEFAULT,
0,
+ },
+ {
+ AFE_API_VERSION_I2S_CONFIG,
+ Q6AFE_LPASS_CLK_ID_QUI_MI2S_IBIT,
+ Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
+ Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
+ Q6AFE_LPASS_CLK_ROOT_DEFAULT,
+ 0,
}
};
@@ -415,7 +415,7 @@
},
{
AFE_API_VERSION_I2S_CONFIG,
- Q6AFE_LPASS_CLK_ID_MCLK_4,
+ Q6AFE_LPASS_CLK_ID_MCLK_2,
Q6AFE_LPASS_OSR_CLK_9_P600_MHZ,
Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
Q6AFE_LPASS_CLK_ROOT_DEFAULT,
@@ -431,7 +431,15 @@
},
{
AFE_API_VERSION_I2S_CONFIG,
- Q6AFE_LPASS_CLK_ID_MCLK_2,
+ Q6AFE_LPASS_CLK_ID_MCLK_1,
+ Q6AFE_LPASS_OSR_CLK_9_P600_MHZ,
+ Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
+ Q6AFE_LPASS_CLK_ROOT_DEFAULT,
+ 0,
+ },
+ {
+ AFE_API_VERSION_I2S_CONFIG,
+ Q6AFE_LPASS_CLK_ID_QUI_MI2S_OSR,
Q6AFE_LPASS_OSR_CLK_9_P600_MHZ,
Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
Q6AFE_LPASS_CLK_ROOT_DEFAULT,
@@ -2614,6 +2622,8 @@
int port_id = msm_get_port_id(rtd->dai_link->id);
int index = cpu_dai->id;
unsigned int fmt = SND_SOC_DAIFMT_CBS_CFS;
+ struct msm_asoc_mach_data *pdata =
+ snd_soc_card_get_drvdata(rtd->card);
dev_dbg(rtd->card->dev,
"%s: substream = %s stream = %d, dai name %s, dai ID %d\n",
@@ -2665,6 +2675,9 @@
goto clk_off;
}
}
+ if (pdata->mi2s_gpio_p[index])
+ msm_cdc_pinctrl_select_active_state(
+ pdata->mi2s_gpio_p[index]);
}
mutex_unlock(&mi2s_intf_conf[index].lock);
return 0;
@@ -2691,6 +2704,8 @@
struct snd_soc_pcm_runtime *rtd = substream->private_data;
int port_id = msm_get_port_id(rtd->dai_link->id);
int index = rtd->cpu_dai->id;
+ struct msm_asoc_mach_data *pdata =
+ snd_soc_card_get_drvdata(rtd->card);
pr_debug("%s(): substream = %s stream = %d\n", __func__,
substream->name, substream->stream);
@@ -2701,6 +2716,10 @@
mutex_lock(&mi2s_intf_conf[index].lock);
if (--mi2s_intf_conf[index].ref_cnt == 0) {
+ if (pdata->mi2s_gpio_p[index])
+ msm_cdc_pinctrl_select_sleep_state(
+ pdata->mi2s_gpio_p[index]);
+
ret = msm_mi2s_set_sclk(substream, false);
if (ret < 0) {
pr_err("%s:clock disable failed for MI2S (%d); ret=%d\n",
@@ -3245,6 +3264,16 @@
"qcom,cdc-ext-spk-gpios", 0);
}
+ pdata->mi2s_gpio_p[PRIM_MI2S] = of_parse_phandle(pdev->dev.of_node,
+ "qcom,pri-mi2s-gpios", 0);
+ pdata->mi2s_gpio_p[SEC_MI2S] = of_parse_phandle(pdev->dev.of_node,
+ "qcom,sec-mi2s-gpios", 0);
+ pdata->mi2s_gpio_p[TERT_MI2S] = of_parse_phandle(pdev->dev.of_node,
+ "qcom,tert-mi2s-gpios", 0);
+ pdata->mi2s_gpio_p[QUAT_MI2S] = of_parse_phandle(pdev->dev.of_node,
+ "qcom,quat-mi2s-gpios", 0);
+ pdata->mi2s_gpio_p[QUIN_MI2S] = of_parse_phandle(pdev->dev.of_node,
+ "qcom,quin-mi2s-gpios", 0);
/*
* Parse US-Euro gpio info from DT. Report no error if us-euro
* entry is not found in DT file as some targets do not support
diff --git a/asoc/sdm660-common.h b/asoc/sdm660-common.h
index 3276d1f..2c8e29e 100644
--- a/asoc/sdm660-common.h
+++ b/asoc/sdm660-common.h
@@ -61,6 +61,15 @@
};
enum {
+ PRIM_MI2S = 0,
+ SEC_MI2S,
+ TERT_MI2S,
+ QUAT_MI2S,
+ QUIN_MI2S,
+ MI2S_MAX,
+};
+
+enum {
DIG_CDC,
ANA_CDC,
CODECS_MAX,
@@ -90,6 +99,7 @@
struct device_node *comp_gpio_p; /* used by pinctrl API */
struct device_node *dmic_gpio_p; /* used by pinctrl API */
struct device_node *ext_spk_gpio_p; /* used by pinctrl API */
+ struct device_node *mi2s_gpio_p[MI2S_MAX]; /* used by pinctrl API */
struct snd_soc_codec *codec;
struct sdm660_codec sdm660_codec_fn;
struct snd_info_entry *codec_root;
diff --git a/config/sdm845auto.conf b/config/sdm845auto.conf
index 64ca29f..5234e2b 100644
--- a/config/sdm845auto.conf
+++ b/config/sdm845auto.conf
@@ -1,14 +1,16 @@
-CONFIG_PINCTRL_WCD=y
-CONFIG_SND_SOC_WCD934X=y
-CONFIG_AUDIO_EXT_CLK=y
-CONFIG_SND_SOC_WCD9XXX_V2=y
-CONFIG_SND_SOC_WCD_MBHC=y
-CONFIG_SND_SOC_WSA881X=y
-CONFIG_SND_SOC_WCD_DSP_MGR=y
-CONFIG_SND_SOC_WCD_SPI=y
-CONFIG_SND_SOC_WCD934X=y
-CONFIG_SND_SOC_WCD934X_MBHC=y
-CONFIG_SND_SOC_WCD934X_DSD=y
+CONFIG_PINCTRL_WCD=m
+CONFIG_SND_SOC_WCD9XXX_V2=m
+CONFIG_SND_SOC_WCD_MBHC=m
+CONFIG_SND_SOC_WSA881X=m
+CONFIG_SND_SOC_WCD_SPI=m
+CONFIG_SND_SOC_WCD934X=m
+CONFIG_SOUNDWIRE_WCD_CTRL=m
+CONFIG_WCD9XXX_CODEC_CORE=m
+CONFIG_MSM_CDC_PINCTRL=m
+CONFIG_SND_SOC_WCD934X_MBHC=m
+CONFIG_SND_SOC_WCD934X_DSD=m
+CONFIG_SND_SOC_MACHINE_SDM845=m
+CONFIG_WCD_DSP_GLINK=m
CONFIG_MSM_QDSP6V2_CODECS=y
CONFIG_MSM_ULTRASOUND=y
CONFIG_MSM_QDSP6_APRV2_GLINK=y
@@ -19,15 +21,10 @@
CONFIG_MSM_QDSP6_PDR=y
CONFIG_MSM_QDSP6_NOTIFIER=y
CONFIG_SND_SOC_MSM_HOSTLESS_PCM=y
-CONFIG_SND_SOC_MSM_QDSP6V2_INTF=y
CONFIG_SND_SOC_SDM845=y
CONFIG_MSM_GLINK_SPI_XPRT=y
CONFIG_SOUNDWIRE=y
-CONFIG_SOUNDWIRE_WCD_CTRL=y
CONFIG_SND_SOC_QDSP6V2=y
-CONFIG_SND_SOC_MSM_QDSP6V2_INTF=y
-CONFIG_MSM_CDC_PINCTRL=y
-CONFIG_WCD9XXX_CODEC_CORE=y
CONFIG_SND_SOC_WCD_MBHC_ADC=y
CONFIG_QTI_PP=y
CONFIG_SND_HWDEP=y
@@ -35,8 +32,6 @@
CONFIG_DOLBY_DS2=y
CONFIG_DOLBY_LICENSE=y
CONFIG_DTS_SRS_TM=y
-CONFIG_SND_SOC_MACHINE_SDM845=y
CONFIG_SND_SOC_MSM_STUB=y
-CONFIG_WCD_DSP_GLINK=y
CONFIG_MSM_AVTIMER=y
CONFIG_SND_SOC_MSM_HDMI_CODEC_RX=y
diff --git a/dsp/codecs/audio_utils_aio.h b/dsp/codecs/audio_utils_aio.h
index 82374f9..e44f9d9 100644
--- a/dsp/codecs/audio_utils_aio.h
+++ b/dsp/codecs/audio_utils_aio.h
@@ -20,7 +20,6 @@
#include <linux/sched.h>
#include <linux/uaccess.h>
#include <linux/wait.h>
-#include <linux/wakelock.h>
#include <linux/msm_audio.h>
#include <linux/debugfs.h>
#include <linux/list.h>
diff --git a/dsp/q6afe.c b/dsp/q6afe.c
index 0289144..a91e119 100644
--- a/dsp/q6afe.c
+++ b/dsp/q6afe.c
@@ -15,7 +15,6 @@
#include <linux/kthread.h>
#include <linux/uaccess.h>
#include <linux/wait.h>
-#include <linux/wakelock.h>
#include <linux/jiffies.h>
#include <linux/sched.h>
#include <linux/delay.h>
@@ -495,6 +494,7 @@
case AFE_PORT_ID_SECONDARY_PCM_RX:
case AFE_PORT_ID_TERTIARY_PCM_RX:
case AFE_PORT_ID_QUATERNARY_PCM_RX:
+ case AFE_PORT_ID_QUINARY_PCM_RX:
case AFE_PORT_ID_PRIMARY_TDM_RX:
case AFE_PORT_ID_PRIMARY_TDM_RX_1:
case AFE_PORT_ID_PRIMARY_TDM_RX_2:
@@ -527,6 +527,14 @@
case AFE_PORT_ID_QUATERNARY_TDM_RX_5:
case AFE_PORT_ID_QUATERNARY_TDM_RX_6:
case AFE_PORT_ID_QUATERNARY_TDM_RX_7:
+ case AFE_PORT_ID_QUINARY_TDM_RX:
+ case AFE_PORT_ID_QUINARY_TDM_RX_1:
+ case AFE_PORT_ID_QUINARY_TDM_RX_2:
+ case AFE_PORT_ID_QUINARY_TDM_RX_3:
+ case AFE_PORT_ID_QUINARY_TDM_RX_4:
+ case AFE_PORT_ID_QUINARY_TDM_RX_5:
+ case AFE_PORT_ID_QUINARY_TDM_RX_6:
+ case AFE_PORT_ID_QUINARY_TDM_RX_7:
case AFE_PORT_ID_USB_RX:
case AFE_PORT_ID_INT0_MI2S_RX:
case AFE_PORT_ID_INT1_MI2S_RX:
@@ -566,6 +574,7 @@
case AFE_PORT_ID_SECONDARY_PCM_TX:
case AFE_PORT_ID_TERTIARY_PCM_TX:
case AFE_PORT_ID_QUATERNARY_PCM_TX:
+ case AFE_PORT_ID_QUINARY_PCM_TX:
case AFE_PORT_ID_PRIMARY_TDM_TX:
case AFE_PORT_ID_PRIMARY_TDM_TX_1:
case AFE_PORT_ID_PRIMARY_TDM_TX_2:
@@ -598,6 +607,14 @@
case AFE_PORT_ID_QUATERNARY_TDM_TX_5:
case AFE_PORT_ID_QUATERNARY_TDM_TX_6:
case AFE_PORT_ID_QUATERNARY_TDM_TX_7:
+ case AFE_PORT_ID_QUINARY_TDM_TX:
+ case AFE_PORT_ID_QUINARY_TDM_TX_1:
+ case AFE_PORT_ID_QUINARY_TDM_TX_2:
+ case AFE_PORT_ID_QUINARY_TDM_TX_3:
+ case AFE_PORT_ID_QUINARY_TDM_TX_4:
+ case AFE_PORT_ID_QUINARY_TDM_TX_5:
+ case AFE_PORT_ID_QUINARY_TDM_TX_6:
+ case AFE_PORT_ID_QUINARY_TDM_TX_7:
case AFE_PORT_ID_USB_TX:
case AFE_PORT_ID_INT0_MI2S_TX:
case AFE_PORT_ID_INT1_MI2S_TX:
@@ -685,6 +702,8 @@
case AFE_PORT_ID_TERTIARY_PCM_TX:
case AFE_PORT_ID_QUATERNARY_PCM_RX:
case AFE_PORT_ID_QUATERNARY_PCM_TX:
+ case AFE_PORT_ID_QUINARY_PCM_RX:
+ case AFE_PORT_ID_QUINARY_PCM_TX:
default:
pr_debug("%s: default case 0x%x\n", __func__, port_id);
ret_size = SIZEOF_CFG_CMD(afe_param_id_pcm_cfg);
@@ -3071,6 +3090,8 @@
case AFE_PORT_ID_TERTIARY_PCM_TX:
case AFE_PORT_ID_QUATERNARY_PCM_RX:
case AFE_PORT_ID_QUATERNARY_PCM_TX:
+ case AFE_PORT_ID_QUINARY_PCM_RX:
+ case AFE_PORT_ID_QUINARY_PCM_TX:
cfg_type = AFE_PARAM_ID_PCM_CONFIG;
break;
case PRIMARY_I2S_RX:
@@ -3288,6 +3309,10 @@
return IDX_AFE_PORT_ID_QUATERNARY_PCM_RX;
case AFE_PORT_ID_QUATERNARY_PCM_TX:
return IDX_AFE_PORT_ID_QUATERNARY_PCM_TX;
+ case AFE_PORT_ID_QUINARY_PCM_RX:
+ return IDX_AFE_PORT_ID_QUINARY_PCM_RX;
+ case AFE_PORT_ID_QUINARY_PCM_TX:
+ return IDX_AFE_PORT_ID_QUINARY_PCM_TX;
case SECONDARY_I2S_RX: return IDX_SECONDARY_I2S_RX;
case SECONDARY_I2S_TX: return IDX_SECONDARY_I2S_TX;
case MI2S_RX: return IDX_MI2S_RX;
@@ -3481,6 +3506,38 @@
return IDX_AFE_PORT_ID_QUATERNARY_TDM_RX_7;
case AFE_PORT_ID_QUATERNARY_TDM_TX_7:
return IDX_AFE_PORT_ID_QUATERNARY_TDM_TX_7;
+ case AFE_PORT_ID_QUINARY_TDM_RX:
+ return IDX_AFE_PORT_ID_QUINARY_TDM_RX_0;
+ case AFE_PORT_ID_QUINARY_TDM_TX:
+ return IDX_AFE_PORT_ID_QUINARY_TDM_TX_0;
+ case AFE_PORT_ID_QUINARY_TDM_RX_1:
+ return IDX_AFE_PORT_ID_QUINARY_TDM_RX_1;
+ case AFE_PORT_ID_QUINARY_TDM_TX_1:
+ return IDX_AFE_PORT_ID_QUINARY_TDM_TX_1;
+ case AFE_PORT_ID_QUINARY_TDM_RX_2:
+ return IDX_AFE_PORT_ID_QUINARY_TDM_RX_2;
+ case AFE_PORT_ID_QUINARY_TDM_TX_2:
+ return IDX_AFE_PORT_ID_QUINARY_TDM_TX_2;
+ case AFE_PORT_ID_QUINARY_TDM_RX_3:
+ return IDX_AFE_PORT_ID_QUINARY_TDM_RX_3;
+ case AFE_PORT_ID_QUINARY_TDM_TX_3:
+ return IDX_AFE_PORT_ID_QUINARY_TDM_TX_3;
+ case AFE_PORT_ID_QUINARY_TDM_RX_4:
+ return IDX_AFE_PORT_ID_QUINARY_TDM_RX_4;
+ case AFE_PORT_ID_QUINARY_TDM_TX_4:
+ return IDX_AFE_PORT_ID_QUINARY_TDM_TX_4;
+ case AFE_PORT_ID_QUINARY_TDM_RX_5:
+ return IDX_AFE_PORT_ID_QUINARY_TDM_RX_5;
+ case AFE_PORT_ID_QUINARY_TDM_TX_5:
+ return IDX_AFE_PORT_ID_QUINARY_TDM_TX_5;
+ case AFE_PORT_ID_QUINARY_TDM_RX_6:
+ return IDX_AFE_PORT_ID_QUINARY_TDM_RX_6;
+ case AFE_PORT_ID_QUINARY_TDM_TX_6:
+ return IDX_AFE_PORT_ID_QUINARY_TDM_TX_6;
+ case AFE_PORT_ID_QUINARY_TDM_RX_7:
+ return IDX_AFE_PORT_ID_QUINARY_TDM_RX_7;
+ case AFE_PORT_ID_QUINARY_TDM_TX_7:
+ return IDX_AFE_PORT_ID_QUINARY_TDM_TX_7;
case AFE_PORT_ID_INT0_MI2S_RX:
return IDX_AFE_PORT_ID_INT0_MI2S_RX;
case AFE_PORT_ID_INT0_MI2S_TX:
@@ -3597,6 +3654,8 @@
case AFE_PORT_ID_TERTIARY_PCM_TX:
case AFE_PORT_ID_QUATERNARY_PCM_RX:
case AFE_PORT_ID_QUATERNARY_PCM_TX:
+ case AFE_PORT_ID_QUINARY_PCM_RX:
+ case AFE_PORT_ID_QUINARY_PCM_TX:
cfg_type = AFE_PARAM_ID_PCM_CONFIG;
break;
case SECONDARY_I2S_RX:
@@ -3980,6 +4039,8 @@
case AFE_GROUP_DEVICE_ID_TERTIARY_TDM_TX:
case AFE_GROUP_DEVICE_ID_QUATERNARY_TDM_RX:
case AFE_GROUP_DEVICE_ID_QUATERNARY_TDM_TX:
+ case AFE_GROUP_DEVICE_ID_QUINARY_TDM_RX:
+ case AFE_GROUP_DEVICE_ID_QUINARY_TDM_TX:
cfg_type = AFE_PARAM_ID_GROUP_DEVICE_TDM_CONFIG;
break;
default:
@@ -5262,6 +5323,8 @@
case AFE_PORT_ID_TERTIARY_PCM_TX:
case AFE_PORT_ID_QUATERNARY_PCM_RX:
case AFE_PORT_ID_QUATERNARY_PCM_TX:
+ case AFE_PORT_ID_QUINARY_PCM_RX:
+ case AFE_PORT_ID_QUINARY_PCM_TX:
case SECONDARY_I2S_RX:
case SECONDARY_I2S_TX:
case MI2S_RX:
@@ -5376,6 +5439,22 @@
case AFE_PORT_ID_QUATERNARY_TDM_TX_6:
case AFE_PORT_ID_QUATERNARY_TDM_RX_7:
case AFE_PORT_ID_QUATERNARY_TDM_TX_7:
+ case AFE_PORT_ID_QUINARY_TDM_RX:
+ case AFE_PORT_ID_QUINARY_TDM_TX:
+ case AFE_PORT_ID_QUINARY_TDM_RX_1:
+ case AFE_PORT_ID_QUINARY_TDM_TX_1:
+ case AFE_PORT_ID_QUINARY_TDM_RX_2:
+ case AFE_PORT_ID_QUINARY_TDM_TX_2:
+ case AFE_PORT_ID_QUINARY_TDM_RX_3:
+ case AFE_PORT_ID_QUINARY_TDM_TX_3:
+ case AFE_PORT_ID_QUINARY_TDM_RX_4:
+ case AFE_PORT_ID_QUINARY_TDM_TX_4:
+ case AFE_PORT_ID_QUINARY_TDM_RX_5:
+ case AFE_PORT_ID_QUINARY_TDM_TX_5:
+ case AFE_PORT_ID_QUINARY_TDM_RX_6:
+ case AFE_PORT_ID_QUINARY_TDM_TX_6:
+ case AFE_PORT_ID_QUINARY_TDM_RX_7:
+ case AFE_PORT_ID_QUINARY_TDM_TX_7:
case AFE_PORT_ID_INT0_MI2S_RX:
case AFE_PORT_ID_INT1_MI2S_RX:
case AFE_PORT_ID_INT2_MI2S_RX:
diff --git a/dsp/rtac.c b/dsp/rtac.c
index 456ac57..84ef835 100644
--- a/dsp/rtac.c
+++ b/dsp/rtac.c
@@ -909,6 +909,14 @@
bytes_returned = ((u32 *)rtac_cal[ADM_RTAC_CAL].cal_data.
kvaddr)[2] + 3 * sizeof(u32);
+ if (bytes_returned > rtac_cal[ADM_RTAC_CAL].
+ map_data.map_size) {
+ pr_err("%s: Invalid data size = %d\n",
+ __func__, bytes_returned);
+ result = -EINVAL;
+ goto err;
+ }
+
if (bytes_returned > user_buf_size) {
pr_err("%s: User buf not big enough, size = 0x%x, returned size = 0x%x\n",
__func__, user_buf_size, bytes_returned);
@@ -1132,6 +1140,14 @@
bytes_returned = ((u32 *)rtac_cal[ASM_RTAC_CAL].cal_data.
kvaddr)[2] + 3 * sizeof(u32);
+ if (bytes_returned > rtac_cal[ASM_RTAC_CAL].
+ map_data.map_size) {
+ pr_err("%s: Invalid data size = %d\n",
+ __func__, bytes_returned);
+ result = -EINVAL;
+ goto err;
+ }
+
if (bytes_returned > user_buf_size) {
pr_err("%s: User buf not big enough, size = 0x%x, returned size = 0x%x\n",
__func__, user_buf_size, bytes_returned);
@@ -1392,6 +1408,14 @@
bytes_returned = get_resp->param_size +
sizeof(struct afe_port_param_data_v2);
+ if (bytes_returned > rtac_cal[AFE_RTAC_CAL].
+ map_data.map_size) {
+ pr_err("%s: Invalid data size = %d\n",
+ __func__, bytes_returned);
+ result = -EINVAL;
+ goto err;
+ }
+
if (bytes_returned > user_afe_buf.buf_size) {
pr_err("%s: user size = 0x%x, returned size = 0x%x\n",
__func__, user_afe_buf.buf_size,
@@ -1617,6 +1641,14 @@
bytes_returned = ((u32 *)rtac_cal[VOICE_RTAC_CAL].cal_data.
kvaddr)[2] + 3 * sizeof(u32);
+ if (bytes_returned > rtac_cal[VOICE_RTAC_CAL].
+ map_data.map_size) {
+ pr_err("%s: Invalid data size = %d\n",
+ __func__, bytes_returned);
+ result = -EINVAL;
+ goto err;
+ }
+
if (bytes_returned > user_buf_size) {
pr_err("%s: User buf not big enough, size = 0x%x, returned size = 0x%x\n",
__func__, user_buf_size, bytes_returned);
diff --git a/dsp/usf.c b/dsp/usf.c
index dfa2097..f75439d 100644
--- a/dsp/usf.c
+++ b/dsp/usf.c
@@ -22,7 +22,6 @@
#include <linux/uaccess.h>
#include <linux/time.h>
#include <linux/kmemleak.h>
-#include <linux/wakelock.h>
#include <linux/mutex.h>
#include <dsp/apr_audio-v2.h>
#include "q6usm.h"
diff --git a/include/dsp/q6afe-v2.h b/include/dsp/q6afe-v2.h
index 7df993e..8fb480b 100644
--- a/include/dsp/q6afe-v2.h
+++ b/include/dsp/q6afe-v2.h
@@ -205,6 +205,25 @@
IDX_AFE_PORT_ID_INT5_MI2S_TX,
IDX_AFE_PORT_ID_INT6_MI2S_RX,
IDX_AFE_PORT_ID_INT6_MI2S_TX,
+ /* IDX 143-> 160 */
+ IDX_AFE_PORT_ID_QUINARY_PCM_RX,
+ IDX_AFE_PORT_ID_QUINARY_PCM_TX,
+ IDX_AFE_PORT_ID_QUINARY_TDM_RX_0,
+ IDX_AFE_PORT_ID_QUINARY_TDM_TX_0,
+ IDX_AFE_PORT_ID_QUINARY_TDM_RX_1,
+ IDX_AFE_PORT_ID_QUINARY_TDM_TX_1,
+ IDX_AFE_PORT_ID_QUINARY_TDM_RX_2,
+ IDX_AFE_PORT_ID_QUINARY_TDM_TX_2,
+ IDX_AFE_PORT_ID_QUINARY_TDM_RX_3,
+ IDX_AFE_PORT_ID_QUINARY_TDM_TX_3,
+ IDX_AFE_PORT_ID_QUINARY_TDM_RX_4,
+ IDX_AFE_PORT_ID_QUINARY_TDM_TX_4,
+ IDX_AFE_PORT_ID_QUINARY_TDM_RX_5,
+ IDX_AFE_PORT_ID_QUINARY_TDM_TX_5,
+ IDX_AFE_PORT_ID_QUINARY_TDM_RX_6,
+ IDX_AFE_PORT_ID_QUINARY_TDM_TX_6,
+ IDX_AFE_PORT_ID_QUINARY_TDM_RX_7,
+ IDX_AFE_PORT_ID_QUINARY_TDM_TX_7,
AFE_MAX_PORTS
};
diff --git a/include/soc/swr-wcd.h b/include/soc/swr-wcd.h
index 041b901..f6ff61a 100644
--- a/include/soc/swr-wcd.h
+++ b/include/soc/swr-wcd.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2015, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2015, 2017 The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -30,6 +30,13 @@
u8 *port;
};
+#if IS_ENABLED(CONFIG_SOUNDWIRE_WCD_CTRL)
extern int swrm_wcd_notify(struct platform_device *pdev, u32 id, void *data);
-
+#else /* CONFIG_SOUNDWIRE_WCD_CTRL */
+static inline int swrm_wcd_notify(struct platform_device *pdev, u32 id,
+ void *data)
+{
+ return 0;
+}
+#endif /* CONFIG_SOUNDWIRE_WCD_CTRL */
#endif /* _LINUX_SWR_WCD_H */