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: Laxminath Kasam <lkasam@codeaurora.org>
This commit is contained in:
Laxminath Kasam 2016-11-16 19:27:44 +05:30
parent 1b29a217c2
commit f88f90a547
5 changed files with 62 additions and 23 deletions

View file

@ -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,12 +2689,15 @@ static int msm_asoc_machine_probe(struct platform_device *pdev)
if (!card)
goto err;
/*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);
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);
goto err;
}
}
/*
@ -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);

View file

@ -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,

View file

@ -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;
}

View file

@ -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))

View file

@ -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