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") || 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);

View file

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

View file

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

View file

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

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