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:
parent
1b29a217c2
commit
f88f90a547
5 changed files with 62 additions and 23 deletions
|
@ -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);
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue