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") ||
|
if (!strcmp(match->data, "tasha_codec") ||
|
||||||
!strcmp(match->data, "tavil_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);
|
ret = msm_ext_cdc_init(pdev, pdata, &card, &mbhc_cfg);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err;
|
goto err;
|
||||||
} else if (!strcmp(match->data, "internal_codec")) {
|
} 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);
|
ret = msm_int_cdc_init(pdev, pdata, &card, &mbhc_cfg);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err;
|
goto err;
|
||||||
|
@ -2685,12 +2689,15 @@ static int msm_asoc_machine_probe(struct platform_device *pdev)
|
||||||
if (!card)
|
if (!card)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
/*reading the gpio configurations from dtsi file*/
|
if (pdata->snd_card_val == INT_SND_CARD) {
|
||||||
ret = msm_gpioset_initialize(CLIENT_WCD, &pdev->dev);
|
/*reading the gpio configurations from dtsi file*/
|
||||||
if (ret < 0) {
|
ret = msm_gpioset_initialize(CLIENT_WCD, &pdev->dev);
|
||||||
dev_err(&pdev->dev,
|
if (ret < 0) {
|
||||||
"%s: error reading dtsi files%d\n", __func__, ret);
|
dev_err(&pdev->dev,
|
||||||
goto err;
|
"%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);
|
ret);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
if (pdata->snd_card_val != INT_SND_CARD)
|
||||||
|
msm_ext_register_audio_notifier();
|
||||||
return 0;
|
return 0;
|
||||||
err:
|
err:
|
||||||
if (pdata->us_euro_gpio > 0) {
|
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 snd_soc_card *card = platform_get_drvdata(pdev);
|
||||||
struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
|
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);
|
mutex_destroy(&pdata->cdc_int_mclk0_mutex);
|
||||||
msm_free_auxdev_mem(pdev);
|
msm_free_auxdev_mem(pdev);
|
||||||
|
|
||||||
|
|
|
@ -65,6 +65,12 @@ struct msmfalcon_codec {
|
||||||
enum afe_config_type config_type);
|
enum afe_config_type config_type);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
INT_SND_CARD,
|
||||||
|
EXT_SND_CARD_TASHA,
|
||||||
|
EXT_SND_CARD_TAVIL,
|
||||||
|
};
|
||||||
|
|
||||||
struct msm_asoc_mach_data {
|
struct msm_asoc_mach_data {
|
||||||
int us_euro_gpio; /* used by gpio driver API */
|
int us_euro_gpio; /* used by gpio driver API */
|
||||||
int hph_en1_gpio;
|
int hph_en1_gpio;
|
||||||
|
@ -78,6 +84,7 @@ struct msm_asoc_mach_data {
|
||||||
int spk_ext_pa_gpio;
|
int spk_ext_pa_gpio;
|
||||||
int mclk_freq;
|
int mclk_freq;
|
||||||
int lb_mode;
|
int lb_mode;
|
||||||
|
int snd_card_val;
|
||||||
u8 micbias1_cap_mode;
|
u8 micbias1_cap_mode;
|
||||||
u8 micbias2_cap_mode;
|
u8 micbias2_cap_mode;
|
||||||
atomic_t int_mclk0_rsc_ref;
|
atomic_t int_mclk0_rsc_ref;
|
||||||
|
@ -85,7 +92,6 @@ struct msm_asoc_mach_data {
|
||||||
struct mutex cdc_int_mclk0_mutex;
|
struct mutex cdc_int_mclk0_mutex;
|
||||||
struct delayed_work disable_int_mclk0_work;
|
struct delayed_work disable_int_mclk0_work;
|
||||||
struct afe_clk_set digital_cdc_core_clk;
|
struct afe_clk_set digital_cdc_core_clk;
|
||||||
bool int_codec;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
int msm_common_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
|
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_RX_CH_MAX 2
|
||||||
#define WCN_CDC_SLIM_TX_CH_MAX 3
|
#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 = {
|
static struct snd_soc_ops msm_ext_slimbus_be_ops = {
|
||||||
.hw_params = msm_snd_hw_params,
|
.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.
|
* 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;
|
struct snd_soc_dai_link *msm_ext_dai_links = NULL;
|
||||||
int ret, len1, len2, len3, len4;
|
int ret, len1, len2, len3, len4;
|
||||||
enum codec_variant codec_ver = 0;
|
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;
|
card->dev = dev;
|
||||||
ret = snd_soc_of_parse_card_name(card, "qcom,model");
|
ret = snd_soc_of_parse_card_name(card, "qcom,model");
|
||||||
if (ret) {
|
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->dai_link = msm_ext_dai_links;
|
||||||
card->num_links = len4;
|
card->num_links = len4;
|
||||||
card->dev = dev;
|
|
||||||
|
|
||||||
return card;
|
return card;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1684,6 +1684,21 @@ err_mbhc_cal:
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(msm_audrx_init);
|
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.
|
* 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->anc_micbias = MIC_BIAS_2;
|
||||||
wcd_mbhc_cfg_ptr->enable_anc_mic_detect = false;
|
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)) {
|
if (!(*card)) {
|
||||||
dev_err(&pdev->dev, "%s: Card uninitialized\n", __func__);
|
dev_err(&pdev->dev, "%s: Card uninitialized\n", __func__);
|
||||||
ret = -EPROBE_DEFER;
|
ret = -EPROBE_DEFER;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
(*card)->dev = &pdev->dev;
|
|
||||||
spdev = pdev;
|
spdev = pdev;
|
||||||
platform_set_drvdata(pdev, *card);
|
platform_set_drvdata(pdev, *card);
|
||||||
snd_soc_card_set_drvdata(*card, pdata);
|
snd_soc_card_set_drvdata(*card, pdata);
|
||||||
is_initial_boot = true;
|
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,
|
pdata->hph_en1_gpio = of_get_named_gpio(pdev->dev.of_node,
|
||||||
"qcom,hph-en1-gpio", 0);
|
"qcom,hph-en1-gpio", 0);
|
||||||
if (!gpio_is_valid(pdata->hph_en1_gpio))
|
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_audrx_init(struct snd_soc_pcm_runtime *rtd);
|
||||||
int msm_snd_cpe_hw_params(struct snd_pcm_substream *substream,
|
int msm_snd_cpe_hw_params(struct snd_pcm_substream *substream,
|
||||||
struct snd_pcm_hw_params *params);
|
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,
|
int msm_ext_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
|
||||||
struct snd_pcm_hw_params *params);
|
struct snd_pcm_hw_params *params);
|
||||||
#ifdef CONFIG_SND_SOC_EXT_CODEC
|
#ifdef CONFIG_SND_SOC_EXT_CODEC
|
||||||
int msm_ext_cdc_init(struct platform_device *, struct msm_asoc_mach_data *,
|
int msm_ext_cdc_init(struct platform_device *, struct msm_asoc_mach_data *,
|
||||||
struct snd_soc_card **, struct wcd_mbhc_config *);
|
struct snd_soc_card **, struct wcd_mbhc_config *);
|
||||||
|
void msm_ext_register_audio_notifier(void);
|
||||||
#else
|
#else
|
||||||
inline int msm_ext_cdc_init(struct platform_device *pdev,
|
inline int msm_ext_cdc_init(struct platform_device *pdev,
|
||||||
struct msm_asoc_mach_data *pdata,
|
struct msm_asoc_mach_data *pdata,
|
||||||
|
@ -40,5 +42,9 @@ inline int msm_ext_cdc_init(struct platform_device *pdev,
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void msm_ext_register_audio_notifier(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue