Browse Source

Merge "ASoC: codecs: Add swr dmic as multi codec"

qctecmdr 5 years ago
parent
commit
d658726339

+ 47 - 12
asoc/codecs/swr-dmic.c

@@ -56,6 +56,7 @@ struct swr_dmic_priv {
 	struct swr_device *swr_slave;
 	struct snd_soc_component *component;
 	struct snd_soc_component_driver *driver;
+	struct snd_soc_dai_driver *dai_driver;
 	struct snd_soc_component *supply_component;
 	u32 micb_num;
 	struct device_node *wcd_handle;
@@ -66,10 +67,10 @@ struct swr_dmic_priv {
 };
 
 const char *codec_name_list[] = {
-	"swr-dmic-01",
-	"swr-dmic-02",
-	"swr-dmic-03",
-	"swr-dmic-04",
+	"swr-dmic.01",
+	"swr-dmic.02",
+	"swr-dmic.03",
+	"swr-dmic.04",
 };
 
 const char *dai_name_list[] = {
@@ -80,10 +81,10 @@ const char *dai_name_list[] = {
 };
 
 const char *aif_name_list[] = {
-	"SWR_DMIC_AIF0 Playback",
-	"SWR_DMIC_AIF1 Playback",
-	"SWR_DMIC_AIF2 Playback",
-	"SWR_DMIC_AIF3 Playback",
+	"SWR_DMIC_AIF0 Capture",
+	"SWR_DMIC_AIF1 Capture",
+	"SWR_DMIC_AIF2 Capture",
+	"SWR_DMIC_AIF3 Capture",
 };
 
 static int swr_dmic_reset(struct swr_device *pdev);
@@ -391,6 +392,26 @@ static int swr_dmic_parse_supply(struct device_node *np,
 	return 0;
 }
 
+static struct snd_soc_dai_driver swr_dmic_dai[] = {
+	{
+		.name = "",
+		.id = 0,
+		.capture = {
+			.stream_name = "",
+			.rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
+				SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |
+				SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000),
+			.formats = (SNDRV_PCM_FMTBIT_S16_LE |
+				SNDRV_PCM_FMTBIT_S24_LE |
+				SNDRV_PCM_FMTBIT_S32_LE),
+			.rate_max = 192000,
+			.rate_min = 8000,
+			.channels_min = 1,
+			.channels_max = 2,
+		},
+	},
+};
+
 static int swr_dmic_probe(struct swr_device *pdev)
 {
 	int ret = 0;
@@ -497,10 +518,24 @@ static int swr_dmic_probe(struct swr_device *pdev)
 		goto dev_err;
 	}
 
-	swr_dmic->driver->name = dai_name_list[dev_index];
+	swr_dmic->driver->name = codec_name_list[dev_index];
+
+	swr_dmic->dai_driver = devm_kzalloc(&pdev->dev,
+			sizeof(struct snd_soc_dai_driver), GFP_KERNEL);
+	if (!swr_dmic->dai_driver) {
+		ret = -ENOMEM;
+		goto dev_err;
+	}
+
+	memcpy(swr_dmic->dai_driver, swr_dmic_dai,
+			sizeof(struct snd_soc_dai_driver));
+	swr_dmic->dai_driver->id = dev_index;
+	swr_dmic->dai_driver->name = dai_name_list[dev_index];
+	swr_dmic->dai_driver->capture.stream_name = aif_name_list[dev_index];
 
+	/* Number of DAI's used is 1 */
 	ret = snd_soc_register_component(&pdev->dev, swr_dmic->driver,
-				NULL, 0);
+				swr_dmic->dai_driver, 1);
 	if (ret) {
 		dev_err(&pdev->dev, "%s: Codec registration failed\n",
 			__func__);
@@ -511,14 +546,14 @@ static int swr_dmic_probe(struct swr_device *pdev)
 						swr_dmic->driver->name);
 	swr_dmic->component = component;
 	prefix_name = devm_kzalloc(&pdev->dev,
-					strlen(swr_dmic_name_prefix_of),
+					strlen(swr_dmic_name_prefix_of) + 1,
 					GFP_KERNEL);
 	if (!prefix_name) {
 		ret = -ENOMEM;
 		goto dev_err;
 	}
 	strlcpy(prefix_name, swr_dmic_name_prefix_of,
-			strlen(swr_dmic_name_prefix_of));
+			strlen(swr_dmic_name_prefix_of) + 1);
 	component->name_prefix = prefix_name;
 
 	if (swr_dmic->is_en_supply == 1) {

+ 37 - 3
asoc/codecs/wcd938x/wcd938x.c

@@ -25,8 +25,6 @@
 #include "wcd938x.h"
 #include "internal.h"
 
-
-#define WCD938X_DRV_NAME "wcd938x_codec"
 #define NUM_SWRS_DT_PARAMS 5
 #define WCD938X_VARIANT_ENTRY_SIZE 32
 
@@ -48,6 +46,18 @@
 #define DAPM_MICBIAS3_STANDALONE "MIC BIAS3 Standalone"
 #define DAPM_MICBIAS4_STANDALONE "MIC BIAS4 Standalone"
 
+#define WCD938X_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\
+			SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\
+			SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000 |\
+			SNDRV_PCM_RATE_384000)
+/* Fractional Rates */
+#define WCD938X_FRAC_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_88200 |\
+				SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800)
+
+#define WCD938X_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
+		SNDRV_PCM_FMTBIT_S24_LE |\
+		SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE)
+
 enum {
 	CODEC_TX = 0,
 	CODEC_RX,
@@ -3796,6 +3806,30 @@ static irqreturn_t wcd938x_wd_handle_irq(int irq, void *data)
 	return IRQ_HANDLED;
 }
 
+static struct snd_soc_dai_driver wcd938x_dai[] = {
+	{
+		.name = "wcd938x_cdc",
+		.playback = {
+			.stream_name = "WCD938X_AIF Playback",
+                        .rates = WCD938X_RATES | WCD938X_FRAC_RATES,
+			.formats = WCD938X_FORMATS,
+			.rate_max = 192000,
+			.rate_min = 8000,
+			.channels_min = 1,
+			.channels_max = 4,
+		},
+		.capture = {
+			.stream_name = "WCD938X_AIF Capture",
+                        .rates = WCD938X_RATES | WCD938X_FRAC_RATES,
+			.formats = WCD938X_FORMATS,
+			.rate_max = 192000,
+			.rate_min = 8000,
+			.channels_min = 1,
+			.channels_max = 4,
+		},
+	},
+};
+
 static int wcd938x_bind(struct device *dev)
 {
 	int ret = 0, i = 0;
@@ -3878,7 +3912,7 @@ static int wcd938x_bind(struct device *dev)
 	wcd_disable_irq(&wcd938x->irq_info, WCD938X_IRQ_AUX_PDM_WD_INT);
 
 	ret = snd_soc_register_component(dev, &soc_codec_dev_wcd938x,
-					NULL, 0);
+					wcd938x_dai, ARRAY_SIZE(wcd938x_dai));
 	if (ret) {
 		dev_err(dev, "%s: Codec registration failed\n",
 				__func__);

+ 1 - 0
asoc/codecs/wcd938x/wcd938x.h

@@ -10,6 +10,7 @@
 
 #define WCD938X_MAX_SLAVE_CH_TYPES 13
 #define ZERO 0
+#define WCD938X_DRV_NAME "wcd938x_codec"
 
 enum {
 	WCD9380 = 0,

+ 3 - 0
asoc/codecs/wsa883x/internal.h

@@ -130,6 +130,9 @@ struct wsa883x_priv {
 	int num_supplies;
 	struct regulator_bulk_data *supplies;
 	unsigned long status_mask;
+	char *wsa883x_name_prefix;
+	struct snd_soc_dai_driver *dai_driver;
+	struct snd_soc_component_driver *driver;
 };
 
 #endif /* WSA883X_INTERNAL_H */

+ 95 - 8
asoc/codecs/wsa883x/wsa883x.c

@@ -38,12 +38,23 @@
 #define WSA883X_TEMP_RETRY 3
 #define WSA883X_VBAT_TIMER_SEC    2
 
+#define MAX_NAME_LEN	30
+#define WSA883X_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\
+			SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\
+			SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000 |\
+			SNDRV_PCM_RATE_384000)
+/* Fractional Rates */
+#define WSA883X_FRAC_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_88200 |\
+				SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800)
+
+#define WSA883X_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
+		SNDRV_PCM_FMTBIT_S24_LE |\
+		SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE)
+
 static int wsa883x_vbat_timer_sec = WSA883X_VBAT_TIMER_SEC;
 module_param(wsa883x_vbat_timer_sec, int, 0664);
 MODULE_PARM_DESC(wsa883x_vbat_timer_sec, "timer for VBAT monitor polling");
 
-#define DRV_NAME "wsa-codec"
-
 enum {
 	WSA_4OHMS =4,
 	WSA_8OHMS = 8,
@@ -1242,8 +1253,8 @@ static void wsa883x_codec_remove(struct snd_soc_component *component)
 	return;
 }
 
-static const struct snd_soc_component_driver soc_codec_dev_wsa883x = {
-	.name = DRV_NAME,
+static const struct snd_soc_component_driver soc_codec_dev_wsa883x_wsa = {
+	.name = "",
 	.probe = wsa883x_codec_probe,
 	.remove = wsa883x_codec_remove,
 	.controls = wsa883x_snd_controls,
@@ -1336,6 +1347,21 @@ static int wsa883x_enable_supplies(struct device * dev,
 	return ret;
 }
 
+static struct snd_soc_dai_driver wsa_dai[] = {
+	{
+		.name = "",
+		.playback = {
+			.stream_name = "",
+			.rates = WSA883X_RATES | WSA883X_FRAC_RATES,
+			.formats = WSA883X_FORMATS,
+			.rate_max = 192000,
+			.rate_min = 8000,
+			.channels_min = 1,
+			.channels_max = 2,
+		},
+	},
+};
+
 static int wsa883x_swr_probe(struct swr_device *pdev)
 {
 	int ret = 0, i = 0;
@@ -1343,6 +1369,10 @@ static int wsa883x_swr_probe(struct swr_device *pdev)
 	u8 devnum = 0;
 	bool pin_state_current = false;
 	struct wsa_ctrl_platform_data *plat_data = NULL;
+	struct snd_soc_component *component;
+	const char *wsa883x_name_prefix_of = NULL;
+	char buffer[MAX_NAME_LEN];
+	int dev_index = 0;
 
 	wsa883x = devm_kzalloc(&pdev->dev, sizeof(struct wsa883x_priv),
 			    GFP_KERNEL);
@@ -1445,14 +1475,58 @@ static int wsa883x_swr_probe(struct swr_device *pdev)
 
 	wcd_disable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_PA_ON_ERR);
 
-	ret = snd_soc_register_component(&pdev->dev, &soc_codec_dev_wsa883x,
-				     NULL, 0);
+	ret = of_property_read_string(pdev->dev.of_node, "qcom,wsa-prefix",
+				&wsa883x_name_prefix_of);
 	if (ret) {
-		dev_err(&pdev->dev, "%s: Codec registration failed\n",
-			__func__);
+		dev_err(&pdev->dev,
+			"%s: Looking up %s property in node %s failed\n",
+			__func__, "qcom,wsa-prefix",
+			pdev->dev.of_node->full_name);
 		goto err_irq;
 	}
 
+	wsa883x->driver = devm_kzalloc(&pdev->dev,
+			sizeof(struct snd_soc_component_driver), GFP_KERNEL);
+        if (!wsa883x->driver) {
+                ret = -ENOMEM;
+                goto err_irq;
+        }
+
+        memcpy(wsa883x->driver, &soc_codec_dev_wsa883x_wsa,
+                        sizeof(struct snd_soc_component_driver));
+
+	wsa883x->dai_driver = devm_kzalloc(&pdev->dev,
+				sizeof(struct snd_soc_dai_driver), GFP_KERNEL);
+	if (!wsa883x->dai_driver) {
+		ret = -ENOMEM;
+		goto err_mem;
+	}
+
+	memcpy(wsa883x->dai_driver, wsa_dai, sizeof(struct snd_soc_dai_driver));
+
+	/* Get last digit from HEX format */
+	dev_index = (int)((char)(pdev->addr & 0xF));
+
+	snprintf(buffer, sizeof(buffer), "wsa-codec.%d", dev_index);
+	wsa883x->driver->name = kstrndup(buffer, strlen(buffer), GFP_KERNEL);
+
+	snprintf(buffer, sizeof(buffer), "wsa_rx%d", dev_index);
+	wsa883x->dai_driver->name =
+				kstrndup(buffer, strlen(buffer), GFP_KERNEL);
+
+	snprintf(buffer, sizeof(buffer), "WSA883X_AIF%d Playback", dev_index);
+	wsa883x->dai_driver->playback.stream_name =
+				kstrndup(buffer, strlen(buffer), GFP_KERNEL);
+
+	/* Number of DAI's used is 1 */
+	ret = snd_soc_register_component(&pdev->dev,
+				wsa883x->driver, wsa883x->dai_driver, 1);
+
+	wsa883x->wsa883x_name_prefix = kstrndup(wsa883x_name_prefix_of,
+			strlen(wsa883x_name_prefix_of), GFP_KERNEL);
+	component = snd_soc_lookup_component(&pdev->dev, wsa883x->driver->name);
+	component->name_prefix = wsa883x->wsa883x_name_prefix;
+
 	wsa883x->parent_np = of_parse_phandle(pdev->dev.of_node,
 					      "qcom,bolero-handle", 0);
 	if (wsa883x->parent_np) {
@@ -1517,6 +1591,11 @@ static int wsa883x_swr_probe(struct swr_device *pdev)
 
 	return 0;
 
+err_mem:
+	if (wsa883x->dai_driver)
+		kfree(wsa883x->dai_driver);
+	if (wsa883x->driver)
+		kfree(wsa883x->driver);
 err_irq:
 	wcd_free_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_SAF2WAR, NULL);
 	wcd_free_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_WAR2SAF, NULL);
@@ -1567,6 +1646,14 @@ static int wsa883x_swr_remove(struct swr_device *pdev)
 #endif
 	mutex_destroy(&wsa883x->res_lock);
 	snd_soc_unregister_component(&pdev->dev);
+	kfree(wsa883x->wsa883x_name_prefix);
+	kfree(wsa883x->driver->name);
+	kfree(wsa883x->dai_driver->name);
+	kfree(wsa883x->dai_driver->playback.stream_name);
+	if (wsa883x->dai_driver)
+		kfree(wsa883x->dai_driver);
+	if (wsa883x->driver)
+		kfree(wsa883x->driver);
 	swr_set_dev_data(pdev, NULL);
 	return 0;
 }

File diff suppressed because it is too large
+ 152 - 650
asoc/lahaina.c


+ 27 - 10
asoc/msm_dailink.h

@@ -203,7 +203,8 @@ SND_SOC_DAILINK_DEFS(slimbus8_hostless,
 
 SND_SOC_DAILINK_DEFS(tx_cdcdma5_tx,
 	DAILINK_COMP_ARRAY(COMP_CPU("msm-dai-cdc-dma-dev.45115")),
-	DAILINK_COMP_ARRAY(COMP_CODEC("bolero_codec", "tx_macro_tx3")),
+	DAILINK_COMP_ARRAY(COMP_CODEC("bolero_codec", "tx_macro_tx3"),
+			   COMP_CODEC("wcd938x_codec", "wcd938x_cdc")),
 	DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-hostless")));
 
 /* BE dai-links */
@@ -459,47 +460,63 @@ SND_SOC_DAILINK_DEFS(sen_auxpcm_tx,
 
 SND_SOC_DAILINK_DEFS(wsa_dma_rx0,
 	DAILINK_COMP_ARRAY(COMP_CPU("msm-dai-cdc-dma-dev.45056")),
-	DAILINK_COMP_ARRAY(COMP_CODEC("bolero_codec", "wsa_macro_rx1")),
+	DAILINK_COMP_ARRAY(COMP_CODEC("bolero_codec", "wsa_macro_rx1"),
+			   COMP_CODEC("wsa-codec1", "wsa_rx1"),
+			   COMP_CODEC("wsa-codec2", "wsa_rx2")),
 	DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-routing")));
 
 SND_SOC_DAILINK_DEFS(wsa_dma_rx1,
 	DAILINK_COMP_ARRAY(COMP_CPU("msm-dai-cdc-dma-dev.45058")),
-	DAILINK_COMP_ARRAY(COMP_CODEC("bolero_codec", "wsa_macro_rx_mix")),
+	DAILINK_COMP_ARRAY(COMP_CODEC("bolero_codec", "wsa_macro_rx_mix"),
+			   COMP_CODEC("wsa-codec1", "wsa_rx1"),
+			   COMP_CODEC("wsa-codec2", "wsa_rx2")),
 	DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-routing")));
 
 SND_SOC_DAILINK_DEFS(wsa_dma_tx1,
 	DAILINK_COMP_ARRAY(COMP_CPU("msm-dai-cdc-dma-dev.45059")),
-	DAILINK_COMP_ARRAY(COMP_CODEC("bolero_codec", "wsa_macro_echo")),
+	DAILINK_COMP_ARRAY(COMP_CODEC("bolero_codec", "wsa_macro_echo"),
+			   COMP_CODEC("wsa-codec1", "wsa_rx1"),
+			   COMP_CODEC("wsa-codec2", "wsa_rx2")),
 	DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-routing")));
 
 SND_SOC_DAILINK_DEFS(rx_dma_rx0,
 	DAILINK_COMP_ARRAY(COMP_CPU("msm-dai-cdc-dma-dev.45104")),
-	DAILINK_COMP_ARRAY(COMP_CODEC("bolero_codec", "rx_macro_rx1")),
+	DAILINK_COMP_ARRAY(COMP_CODEC("bolero_codec", "rx_macro_rx1"),
+			   COMP_CODEC("wcd938x_codec", "wcd938x_cdc")),
 	DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-routing")));
 
 SND_SOC_DAILINK_DEFS(rx_dma_rx1,
 	DAILINK_COMP_ARRAY(COMP_CPU("msm-dai-cdc-dma-dev.45106")),
-	DAILINK_COMP_ARRAY(COMP_CODEC("bolero_codec", "rx_macro_rx2")),
+	DAILINK_COMP_ARRAY(COMP_CODEC("bolero_codec", "rx_macro_rx2"),
+			   COMP_CODEC("wcd938x_codec", "wcd938x_cdc")),
 	DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-routing")));
 
 SND_SOC_DAILINK_DEFS(rx_dma_rx2,
 	DAILINK_COMP_ARRAY(COMP_CPU("msm-dai-cdc-dma-dev.45108")),
-	DAILINK_COMP_ARRAY(COMP_CODEC("bolero_codec", "rx_macro_rx3")),
+	DAILINK_COMP_ARRAY(COMP_CODEC("bolero_codec", "rx_macro_rx3"),
+			   COMP_CODEC("wcd938x_codec", "wcd938x_cdc")),
 	DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-routing")));
 
 SND_SOC_DAILINK_DEFS(rx_dma_rx3,
 	DAILINK_COMP_ARRAY(COMP_CPU("msm-dai-cdc-dma-dev.45110")),
-	DAILINK_COMP_ARRAY(COMP_CODEC("bolero_codec", "rx_macro_rx4")),
+	DAILINK_COMP_ARRAY(COMP_CODEC("bolero_codec", "rx_macro_rx4"),
+			   COMP_CODEC("wcd938x_codec", "wcd938x_cdc")),
 	DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-routing")));
 
 SND_SOC_DAILINK_DEFS(tx_dma_tx3,
 	DAILINK_COMP_ARRAY(COMP_CPU("msm-dai-cdc-dma-dev.45111")),
-	DAILINK_COMP_ARRAY(COMP_CODEC("bolero_codec", "tx_macro_tx1")),
+	DAILINK_COMP_ARRAY(COMP_CODEC("bolero_codec", "tx_macro_tx1"),
+			   COMP_CODEC("wcd938x_codec", "wcd938x_cdc")),
 	DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-routing")));
 
 SND_SOC_DAILINK_DEFS(tx_dma_tx4,
 	DAILINK_COMP_ARRAY(COMP_CPU("msm-dai-cdc-dma-dev.45113")),
-	DAILINK_COMP_ARRAY(COMP_CODEC("bolero_codec", "tx_macro_tx2")),
+	DAILINK_COMP_ARRAY(COMP_CODEC("bolero_codec", "tx_macro_tx2"),
+			   COMP_CODEC("wcd938x_codec", "wcd938x_cdc"),
+			   COMP_CODEC("swr-dmic.01", "swr_dmic_tx0"),
+			   COMP_CODEC("swr-dmic.02", "swr_dmic_tx1"),
+			   COMP_CODEC("swr-dmic.03", "swr_dmic_tx2"),
+			   COMP_CODEC("swr-dmic.04", "swr_dmic_tx3")),
 	DAILINK_COMP_ARRAY(COMP_PLATFORM("msm-pcm-routing")));
 
 SND_SOC_DAILINK_DEFS(va_dma_tx0,

Some files were not shown because too many files changed in this diff