Merge "ASOC: Speaker Protection V4 API"
diff --git a/asoc/codecs/wcd938x/wcd938x.c b/asoc/codecs/wcd938x/wcd938x.c
index 79a95c0..3f6292c 100644
--- a/asoc/codecs/wcd938x/wcd938x.c
+++ b/asoc/codecs/wcd938x/wcd938x.c
@@ -3722,7 +3722,7 @@
}
static const struct of_device_id wcd938x_dt_match[] = {
- { .compatible = "qcom,wcd938x-codec" },
+ { .compatible = "qcom,wcd938x-codec", .data = "wcd938x"},
{}
};
diff --git a/asoc/kona-port-config.h b/asoc/kona-port-config.h
index 723c94a..6ab1d29 100644
--- a/asoc/kona-port-config.h
+++ b/asoc/kona-port-config.h
@@ -59,6 +59,14 @@
{3, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 2}, /* TX4 */
};
+static struct port_params tx_frame_params_wcd937x[SWR_MSTR_PORT_LEN] = {
+ {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
+ {3, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0},
+ {3, 2, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0},
+ {3, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0},
+ {3, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0},
+};
+
static struct swr_mstr_port_map sm_port_map[] = {
{TX_MACRO, SWR_UC0, tx_frame_params_default},
{RX_MACRO, SWR_UC0, rx_frame_params_default},
@@ -73,4 +81,11 @@
{WSA_MACRO, SWR_UC0, wsa_frame_params_default},
};
+static struct swr_mstr_port_map sm_port_map_wcd937x[] = {
+ {TX_MACRO, SWR_UC0, tx_frame_params_wcd937x},
+ {RX_MACRO, SWR_UC0, rx_frame_params_default},
+ {RX_MACRO, SWR_UC1, rx_frame_params_dsd},
+ {WSA_MACRO, SWR_UC0, wsa_frame_params_default},
+};
+
#endif /* _KONA_PORT_CONFIG */
diff --git a/asoc/kona.c b/asoc/kona.c
index 33c24f1..2dd6edb 100644
--- a/asoc/kona.c
+++ b/asoc/kona.c
@@ -33,6 +33,8 @@
#include "codecs/wsa881x.h"
#include "codecs/wsa883x/wsa883x.h"
#include "codecs/wcd938x/wcd938x.h"
+#include "codecs/wcd937x/wcd937x-mbhc.h"
+#include "codecs/wcd937x/wcd937x.h"
#include "codecs/bolero/bolero-cdc.h"
#include <dt-bindings/sound/audio-codec-port-types.h>
#include "codecs/bolero/wsa-macro.h"
@@ -860,6 +862,23 @@
static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc85_dma_rx_5_sample_rate,
cdc_dma_sample_rate_text);
+/* WCD937x */
+static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_0_format, bit_format_text);
+static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_1_format, bit_format_text);
+static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_2_format, bit_format_text);
+static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_3_format, bit_format_text);
+static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_5_format, bit_format_text);
+static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_0_sample_rate,
+ cdc_dma_sample_rate_text);
+static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_1_sample_rate,
+ cdc_dma_sample_rate_text);
+static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_2_sample_rate,
+ cdc_dma_sample_rate_text);
+static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_3_sample_rate,
+ cdc_dma_sample_rate_text);
+static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_5_sample_rate,
+ cdc_dma_sample_rate_text);
+
static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_chs, ch_text);
static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_format, ext_disp_bit_format_text);
static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_sample_rate,
@@ -3685,6 +3704,39 @@
cdc_dma_rx_sample_rate_put),
};
+static const struct snd_kcontrol_new msm_int_wcd937x_snd_controls[] = {
+ SOC_ENUM_EXT("RX_CDC_DMA_RX_0 Format", rx_cdc_dma_rx_0_format,
+ cdc_dma_rx_format_get, cdc_dma_rx_format_put),
+ SOC_ENUM_EXT("RX_CDC_DMA_RX_1 Format", rx_cdc_dma_rx_1_format,
+ cdc_dma_rx_format_get, cdc_dma_rx_format_put),
+ SOC_ENUM_EXT("RX_CDC_DMA_RX_2 Format", rx_cdc_dma_rx_2_format,
+ cdc_dma_rx_format_get, cdc_dma_rx_format_put),
+ SOC_ENUM_EXT("RX_CDC_DMA_RX_3 Format", rx_cdc_dma_rx_3_format,
+ cdc_dma_rx_format_get, cdc_dma_rx_format_put),
+ SOC_ENUM_EXT("RX_CDC_DMA_RX_5 Format", rx_cdc_dma_rx_5_format,
+ cdc_dma_rx_format_get, cdc_dma_rx_format_put),
+ SOC_ENUM_EXT("RX_CDC_DMA_RX_0 SampleRate",
+ rx_cdc_dma_rx_0_sample_rate,
+ cdc_dma_rx_sample_rate_get,
+ cdc_dma_rx_sample_rate_put),
+ SOC_ENUM_EXT("RX_CDC_DMA_RX_1 SampleRate",
+ rx_cdc_dma_rx_1_sample_rate,
+ cdc_dma_rx_sample_rate_get,
+ cdc_dma_rx_sample_rate_put),
+ SOC_ENUM_EXT("RX_CDC_DMA_RX_2 SampleRate",
+ rx_cdc_dma_rx_2_sample_rate,
+ cdc_dma_rx_sample_rate_get,
+ cdc_dma_rx_sample_rate_put),
+ SOC_ENUM_EXT("RX_CDC_DMA_RX_3 SampleRate",
+ rx_cdc_dma_rx_3_sample_rate,
+ cdc_dma_rx_sample_rate_get,
+ cdc_dma_rx_sample_rate_put),
+ SOC_ENUM_EXT("RX_CDC_DMA_RX_5 SampleRate",
+ rx_cdc_dma_rx_5_sample_rate,
+ cdc_dma_rx_sample_rate_get,
+ cdc_dma_rx_sample_rate_put),
+};
+
static const struct snd_kcontrol_new msm_common_snd_controls[] = {
SOC_ENUM_EXT("USB_AUDIO_RX SampleRate", usb_rx_sample_rate,
usb_audio_rx_sample_rate_get,
@@ -5371,6 +5423,9 @@
struct snd_card *card;
struct snd_info_entry *entry;
struct snd_soc_component *aux_comp;
+ struct platform_device *pdev = NULL;
+ int i = 0;
+ char *data = NULL;
struct msm_asoc_mach_data *pdata =
snd_soc_card_get_drvdata(rtd->card);
@@ -5447,18 +5502,52 @@
WSA_MACRO_GAIN_OFFSET_M1P5_DB);
}
}
- if (pdata->lito_v2_enabled) {
- /*
- * Enable tx data line3 for saipan version v2 amd
- * write corresponding lpi register.
- */
- bolero_set_port_map(component, ARRAY_SIZE(sm_port_map_v2),
- sm_port_map_v2);
- } else {
- bolero_set_port_map(component, ARRAY_SIZE(sm_port_map),
- sm_port_map);
+ }
+
+ for (i = 0; i < rtd->card->num_aux_devs; i++)
+ {
+ if (msm_aux_dev[i].name != NULL ) {
+ if (strstr(msm_aux_dev[i].name, "wsa"))
+ continue;
+ }
+
+ if (msm_aux_dev[i].codec_of_node) {
+ pdev = of_find_device_by_node(
+ msm_aux_dev[i].codec_of_node);
+
+ if (pdev)
+ data = (char*) of_device_get_match_data(
+ &pdev->dev);
+ if (data != NULL) {
+ if (!strncmp(data, "wcd937x",
+ sizeof("wcd937x"))) {
+ bolero_set_port_map(component,
+ ARRAY_SIZE(sm_port_map_wcd937x),
+ sm_port_map_wcd937x);
+ break;
+ } else if (!strncmp( data, "wcd938x",
+ sizeof("wcd938x"))) {
+ if (pdata->lito_v2_enabled) {
+ /*
+ * Enable tx data line3 for
+ * saipan version v2 and
+ * write corresponding
+ * lpi register.
+ */
+ bolero_set_port_map(component,
+ ARRAY_SIZE(sm_port_map_v2),
+ sm_port_map_v2);
+ } else {
+ bolero_set_port_map(component,
+ ARRAY_SIZE(sm_port_map),
+ sm_port_map);
+ }
+ break;
+ }
+ }
}
}
+
card = rtd->card->snd_card;
if (!pdata->codec_root) {
entry = snd_info_create_subdir(card->module, "codecs",
@@ -7659,18 +7748,24 @@
}
pdata->codec_root = entry;
}
- wcd938x_info_create_codec_entry(pdata->codec_root, component);
-
- codec_variant = wcd938x_get_codec_variant(component);
- dev_dbg(component->dev, "%s: variant %d\n", __func__, codec_variant);
- if (codec_variant == WCD9380)
+ if (!strncmp(component->driver->name, "wcd937x", 7)) {
+ wcd937x_info_create_codec_entry(pdata->codec_root, component);
ret = snd_soc_add_component_controls(component,
- msm_int_wcd9380_snd_controls,
- ARRAY_SIZE(msm_int_wcd9380_snd_controls));
- else if (codec_variant == WCD9385)
- ret = snd_soc_add_component_controls(component,
- msm_int_wcd9385_snd_controls,
- ARRAY_SIZE(msm_int_wcd9385_snd_controls));
+ msm_int_wcd937x_snd_controls,
+ ARRAY_SIZE(msm_int_wcd937x_snd_controls));
+ } else {
+ wcd938x_info_create_codec_entry(pdata->codec_root, component);
+ codec_variant = wcd938x_get_codec_variant(component);
+ dev_dbg(component->dev, "%s: variant %d\n", __func__, codec_variant);
+ if (codec_variant == WCD9380)
+ ret = snd_soc_add_component_controls(component,
+ msm_int_wcd9380_snd_controls,
+ ARRAY_SIZE(msm_int_wcd9380_snd_controls));
+ else if (codec_variant == WCD9385)
+ ret = snd_soc_add_component_controls(component,
+ msm_int_wcd9385_snd_controls,
+ ARRAY_SIZE(msm_int_wcd9385_snd_controls));
+ }
if (ret < 0) {
dev_err(component->dev, "%s: add codec specific snd controls failed: %d\n",
@@ -7683,7 +7778,10 @@
if (!mbhc_calibration)
return -ENOMEM;
wcd_mbhc_cfg.calibration = mbhc_calibration;
- ret = wcd938x_mbhc_hs_detect(component, &wcd_mbhc_cfg);
+ if (!strncmp(component->driver->name, "wcd937x", 7))
+ ret = wcd937x_mbhc_hs_detect(component, &wcd_mbhc_cfg);
+ else
+ ret = wcd938x_mbhc_hs_detect(component, &wcd_mbhc_cfg);
if (ret) {
dev_err(component->dev, "%s: mbhc hs detect failed, err:%d\n",
__func__, ret);