Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f88f90a5 authored by Laxminath Kasam's avatar Laxminath Kasam
Browse files

ASoC: msm: Fix sound card registration failure



In external codec machine driver, register
SSR notifier after sound card register. Also,
add separate snd_soc_card variables for tavil
and tasha since same machine driver is used
for both codecs.

CRs-Fixed: 1083537
Change-Id: I73fc02b812f2e6694e2a6aa8bdad2381a5f19406
Signed-off-by: default avatarLaxminath Kasam <lkasam@codeaurora.org>
parent 1b29a217
Loading
Loading
Loading
Loading
+17 −8
Original line number Diff line number Diff line
@@ -2669,11 +2669,15 @@ static int msm_asoc_machine_probe(struct platform_device *pdev)

	if (!strcmp(match->data, "tasha_codec") ||
	    !strcmp(match->data, "tavil_codec")) {
		if (!strcmp(match->data, "tasha_codec"))
			pdata->snd_card_val = EXT_SND_CARD_TASHA;
		else
			pdata->snd_card_val = EXT_SND_CARD_TAVIL;
		ret = msm_ext_cdc_init(pdev, pdata, &card, &mbhc_cfg);
		if (ret)
			goto err;
	} else if (!strcmp(match->data, "internal_codec")) {
		pdata->int_codec = 1;
		pdata->snd_card_val = INT_SND_CARD;
		ret = msm_int_cdc_init(pdev, pdata, &card, &mbhc_cfg);
		if (ret)
			goto err;
@@ -2685,13 +2689,16 @@ static int msm_asoc_machine_probe(struct platform_device *pdev)
	if (!card)
		goto err;

	if (pdata->snd_card_val == INT_SND_CARD) {
		/*reading the gpio configurations from dtsi file*/
		ret = msm_gpioset_initialize(CLIENT_WCD, &pdev->dev);
		if (ret < 0) {
			dev_err(&pdev->dev,
			"%s: error reading dtsi files%d\n", __func__, ret);
				"%s: error reading dtsi files%d\n",
				__func__, ret);
			goto err;
		}
	}

	/*
	 * Parse US-Euro gpio info from DT. Report no error if us-euro
@@ -2739,6 +2746,8 @@ static int msm_asoc_machine_probe(struct platform_device *pdev)
			ret);
		goto err;
	}
	if (pdata->snd_card_val != INT_SND_CARD)
		msm_ext_register_audio_notifier();
	return 0;
err:
	if (pdata->us_euro_gpio > 0) {
@@ -2767,7 +2776,7 @@ static int msm_asoc_machine_remove(struct platform_device *pdev)
	struct snd_soc_card *card = platform_get_drvdata(pdev);
	struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);

	if (pdata->int_codec)
	if (pdata->snd_card_val == INT_SND_CARD)
		mutex_destroy(&pdata->cdc_int_mclk0_mutex);
	msm_free_auxdev_mem(pdev);

+7 −1
Original line number Diff line number Diff line
@@ -65,6 +65,12 @@ struct msmfalcon_codec {
				   enum afe_config_type config_type);
};

enum {
	INT_SND_CARD,
	EXT_SND_CARD_TASHA,
	EXT_SND_CARD_TAVIL,
};

struct msm_asoc_mach_data {
	int us_euro_gpio; /* used by gpio driver API */
	int hph_en1_gpio;
@@ -78,6 +84,7 @@ struct msm_asoc_mach_data {
	int spk_ext_pa_gpio;
	int mclk_freq;
	int lb_mode;
	int snd_card_val;
	u8 micbias1_cap_mode;
	u8 micbias2_cap_mode;
	atomic_t int_mclk0_rsc_ref;
@@ -85,7 +92,6 @@ struct msm_asoc_mach_data {
	struct mutex cdc_int_mclk0_mutex;
	struct delayed_work disable_int_mclk0_work;
	struct afe_clk_set digital_cdc_core_clk;
	bool int_codec;
};

int msm_common_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
+15 −4
Original line number Diff line number Diff line
@@ -29,7 +29,8 @@
#define WCN_CDC_SLIM_RX_CH_MAX 2
#define WCN_CDC_SLIM_TX_CH_MAX 3

static struct snd_soc_card snd_soc_card_msm_card;
static struct snd_soc_card snd_soc_card_msm_card_tavil;
static struct snd_soc_card snd_soc_card_msm_card_tasha;

static struct snd_soc_ops msm_ext_slimbus_be_ops = {
	.hw_params = msm_snd_hw_params,
@@ -1851,13 +1852,24 @@ ARRAY_SIZE(msm_wcn_be_dai_links)];
 *
 * Returns card on success or NULL on failure.
 */
struct snd_soc_card *populate_snd_card_dailinks(struct device *dev)
struct snd_soc_card *populate_snd_card_dailinks(struct device *dev,
						int snd_card_val)
{
	struct snd_soc_card *card = &snd_soc_card_msm_card;
	struct snd_soc_card *card;
	struct snd_soc_dai_link *msm_ext_dai_links = NULL;
	int ret, len1, len2, len3, len4;
	enum codec_variant codec_ver = 0;

	if (snd_card_val == EXT_SND_CARD_TASHA) {
		card = &snd_soc_card_msm_card_tasha;
	} else if (snd_card_val == EXT_SND_CARD_TAVIL) {
		card = &snd_soc_card_msm_card_tavil;
	} else {
		dev_err(dev, "%s: failing as no matching card name\n",
			__func__);
		return NULL;
	}

	card->dev = dev;
	ret = snd_soc_of_parse_card_name(card, "qcom,model");
	if (ret) {
@@ -1949,7 +1961,6 @@ struct snd_soc_card *populate_snd_card_dailinks(struct device *dev)
	}
	card->dai_link = msm_ext_dai_links;
	card->num_links = len4;
	card->dev = dev;

	return card;
}
+16 −9
Original line number Diff line number Diff line
@@ -1684,6 +1684,21 @@ err_mbhc_cal:
}
EXPORT_SYMBOL(msm_audrx_init);

/**
 * msm_ext_register_audio_notifier - register SSR notifier.
 */
void msm_ext_register_audio_notifier(void)
{
	int ret;

	ret = audio_notifier_register("msmfalcon", AUDIO_NOTIFIER_ADSP_DOMAIN,
				      &service_nb);
	if (ret < 0)
		pr_err("%s: Audio notifier register failed ret = %d\n",
			__func__, ret);
}
EXPORT_SYMBOL(msm_ext_register_audio_notifier);

/**
 * msm_ext_cdc_init - external codec machine specific init.
 *
@@ -1708,24 +1723,16 @@ int msm_ext_cdc_init(struct platform_device *pdev,
	wcd_mbhc_cfg_ptr->anc_micbias = MIC_BIAS_2;
	wcd_mbhc_cfg_ptr->enable_anc_mic_detect = false;

	*card = populate_snd_card_dailinks(&pdev->dev);
	*card = populate_snd_card_dailinks(&pdev->dev, pdata->snd_card_val);
	if (!(*card)) {
		dev_err(&pdev->dev, "%s: Card uninitialized\n", __func__);
		ret = -EPROBE_DEFER;
		goto err;
	}
	(*card)->dev = &pdev->dev;
	spdev = pdev;
	platform_set_drvdata(pdev, *card);
	snd_soc_card_set_drvdata(*card, pdata);
	is_initial_boot = true;
	ret = audio_notifier_register("msmfalcon", AUDIO_NOTIFIER_ADSP_DOMAIN,
				      &service_nb);
	if (ret < 0) {
		pr_err("%s: Audio notifier register failed ret = %d\n",
			__func__, ret);
		goto err;
	}
	pdata->hph_en1_gpio = of_get_named_gpio(pdev->dev.of_node,
						"qcom,hph-en1-gpio", 0);
	if (!gpio_is_valid(pdata->hph_en1_gpio))
+7 −1
Original line number Diff line number Diff line
@@ -26,12 +26,14 @@ int msm_proxy_tx_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
int msm_audrx_init(struct snd_soc_pcm_runtime *rtd);
int msm_snd_cpe_hw_params(struct snd_pcm_substream *substream,
			  struct snd_pcm_hw_params *params);
struct snd_soc_card *populate_snd_card_dailinks(struct device *dev);
struct snd_soc_card *populate_snd_card_dailinks(struct device *dev,
						int snd_card_val);
int msm_ext_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
			       struct snd_pcm_hw_params *params);
#ifdef CONFIG_SND_SOC_EXT_CODEC
int msm_ext_cdc_init(struct platform_device *, struct msm_asoc_mach_data *,
		     struct snd_soc_card **, struct wcd_mbhc_config *);
void msm_ext_register_audio_notifier(void);
#else
inline int msm_ext_cdc_init(struct platform_device *pdev,
			    struct msm_asoc_mach_data *pdata,
@@ -40,5 +42,9 @@ inline int msm_ext_cdc_init(struct platform_device *pdev,
{
	return 0;
}

inline void msm_ext_register_audio_notifier(void)
{
}
#endif
#endif