|
|
|
@ -292,6 +292,9 @@ static const struct file_operations codec_reg_fops = { |
|
|
|
|
|
|
|
|
|
static void soc_init_component_debugfs(struct snd_soc_component *component) |
|
|
|
|
{ |
|
|
|
|
if (!component->card->debugfs_card_root) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
if (component->debugfs_prefix) { |
|
|
|
|
char *name; |
|
|
|
|
|
|
|
|
@ -455,6 +458,9 @@ static const struct file_operations platform_list_fops = { |
|
|
|
|
|
|
|
|
|
static void soc_init_card_debugfs(struct snd_soc_card *card) |
|
|
|
|
{ |
|
|
|
|
if (!snd_soc_debugfs_root) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
card->debugfs_card_root = debugfs_create_dir(card->name, |
|
|
|
|
snd_soc_debugfs_root); |
|
|
|
|
if (!card->debugfs_card_root) { |
|
|
|
@ -476,6 +482,34 @@ static void soc_cleanup_card_debugfs(struct snd_soc_card *card) |
|
|
|
|
debugfs_remove_recursive(card->debugfs_card_root); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void snd_soc_debugfs_init(void) |
|
|
|
|
{ |
|
|
|
|
snd_soc_debugfs_root = debugfs_create_dir("asoc", NULL); |
|
|
|
|
if (IS_ERR(snd_soc_debugfs_root) || !snd_soc_debugfs_root) { |
|
|
|
|
pr_warn("ASoC: Failed to create debugfs directory\n"); |
|
|
|
|
snd_soc_debugfs_root = NULL; |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!debugfs_create_file("codecs", 0444, snd_soc_debugfs_root, NULL, |
|
|
|
|
&codec_list_fops)) |
|
|
|
|
pr_warn("ASoC: Failed to create CODEC list debugfs file\n"); |
|
|
|
|
|
|
|
|
|
if (!debugfs_create_file("dais", 0444, snd_soc_debugfs_root, NULL, |
|
|
|
|
&dai_list_fops)) |
|
|
|
|
pr_warn("ASoC: Failed to create DAI list debugfs file\n"); |
|
|
|
|
|
|
|
|
|
if (!debugfs_create_file("platforms", 0444, snd_soc_debugfs_root, NULL, |
|
|
|
|
&platform_list_fops)) |
|
|
|
|
pr_warn("ASoC: Failed to create platform list debugfs file\n"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void snd_soc_debugfs_exit(void) |
|
|
|
|
{ |
|
|
|
|
debugfs_remove_recursive(snd_soc_debugfs_root); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#else |
|
|
|
|
|
|
|
|
|
#define soc_init_codec_debugfs NULL |
|
|
|
@ -497,6 +531,15 @@ static inline void soc_init_card_debugfs(struct snd_soc_card *card) |
|
|
|
|
static inline void soc_cleanup_card_debugfs(struct snd_soc_card *card) |
|
|
|
|
{ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static inline void snd_soc_debugfs_init(void) |
|
|
|
|
{ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static inline void snd_soc_debugfs_exit(void) |
|
|
|
|
{ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
struct snd_pcm_substream *snd_soc_get_dai_substream(struct snd_soc_card *card, |
|
|
|
@ -595,15 +638,9 @@ int snd_soc_suspend(struct device *dev) |
|
|
|
|
cpu_dai->driver->suspend(cpu_dai); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* close any waiting streams and save state */ |
|
|
|
|
for (i = 0; i < card->num_rtd; i++) { |
|
|
|
|
struct snd_soc_dai **codec_dais = card->rtd[i].codec_dais; |
|
|
|
|
/* close any waiting streams */ |
|
|
|
|
for (i = 0; i < card->num_rtd; i++) |
|
|
|
|
flush_delayed_work(&card->rtd[i].delayed_work); |
|
|
|
|
for (j = 0; j < card->rtd[i].num_codecs; j++) { |
|
|
|
|
codec_dais[j]->codec->dapm.suspend_bias_level = |
|
|
|
|
codec_dais[j]->codec->dapm.bias_level; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for (i = 0; i < card->num_rtd; i++) { |
|
|
|
|
|
|
|
|
@ -1322,21 +1359,17 @@ static int soc_probe_link_dais(struct snd_soc_card *card, int num, int order) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (dai_link->dai_fmt) |
|
|
|
|
snd_soc_runtime_set_dai_fmt(rtd, dai_link->dai_fmt); |
|
|
|
|
|
|
|
|
|
ret = soc_post_component_init(rtd, dai_link->name); |
|
|
|
|
if (ret) |
|
|
|
|
return ret; |
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_DEBUG_FS |
|
|
|
|
/* add DPCM sysfs entries */ |
|
|
|
|
if (dai_link->dynamic) { |
|
|
|
|
ret = soc_dpcm_debugfs_add(rtd); |
|
|
|
|
if (ret < 0) { |
|
|
|
|
dev_err(rtd->dev, |
|
|
|
|
"ASoC: failed to add dpcm sysfs entries: %d\n", |
|
|
|
|
ret); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (dai_link->dynamic) |
|
|
|
|
soc_dpcm_debugfs_add(rtd); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
if (cpu_dai->driver->compress_dai) { |
|
|
|
@ -1426,7 +1459,6 @@ static void soc_remove_aux_dev(struct snd_soc_card *card, int num) |
|
|
|
|
|
|
|
|
|
/* unregister the rtd device */ |
|
|
|
|
if (rtd->dev_registered) { |
|
|
|
|
device_remove_file(rtd->dev, &dev_attr_codec_reg); |
|
|
|
|
device_unregister(rtd->dev); |
|
|
|
|
rtd->dev_registered = 0; |
|
|
|
|
} |
|
|
|
@ -1560,6 +1592,8 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card) |
|
|
|
|
goto base_error; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
soc_init_card_debugfs(card); |
|
|
|
|
|
|
|
|
|
card->dapm.bias_level = SND_SOC_BIAS_OFF; |
|
|
|
|
card->dapm.dev = card->dev; |
|
|
|
|
card->dapm.card = card; |
|
|
|
@ -1641,12 +1675,6 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card) |
|
|
|
|
snd_soc_dapm_add_routes(&card->dapm, card->of_dapm_routes, |
|
|
|
|
card->num_of_dapm_routes); |
|
|
|
|
|
|
|
|
|
for (i = 0; i < card->num_links; i++) { |
|
|
|
|
if (card->dai_link[i].dai_fmt) |
|
|
|
|
snd_soc_runtime_set_dai_fmt(&card->rtd[i], |
|
|
|
|
card->dai_link[i].dai_fmt); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
snprintf(card->snd_card->shortname, sizeof(card->snd_card->shortname), |
|
|
|
|
"%s", card->name); |
|
|
|
|
snprintf(card->snd_card->longname, sizeof(card->snd_card->longname), |
|
|
|
@ -1702,6 +1730,7 @@ card_probe_error: |
|
|
|
|
if (card->remove) |
|
|
|
|
card->remove(card); |
|
|
|
|
|
|
|
|
|
soc_cleanup_card_debugfs(card); |
|
|
|
|
snd_card_free(card->snd_card); |
|
|
|
|
|
|
|
|
|
base_error: |
|
|
|
@ -2380,8 +2409,6 @@ int snd_soc_register_card(struct snd_soc_card *card) |
|
|
|
|
|
|
|
|
|
snd_soc_initialize_card_lists(card); |
|
|
|
|
|
|
|
|
|
soc_init_card_debugfs(card); |
|
|
|
|
|
|
|
|
|
card->rtd = devm_kzalloc(card->dev, |
|
|
|
|
sizeof(struct snd_soc_pcm_runtime) * |
|
|
|
|
(card->num_links + card->num_aux_devs), |
|
|
|
@ -2412,7 +2439,7 @@ int snd_soc_register_card(struct snd_soc_card *card) |
|
|
|
|
|
|
|
|
|
ret = snd_soc_instantiate_card(card); |
|
|
|
|
if (ret != 0) |
|
|
|
|
soc_cleanup_card_debugfs(card); |
|
|
|
|
return ret; |
|
|
|
|
|
|
|
|
|
/* deactivate pins to sleep state */ |
|
|
|
|
for (i = 0; i < card->num_rtd; i++) { |
|
|
|
@ -3595,26 +3622,7 @@ EXPORT_SYMBOL_GPL(snd_soc_of_get_dai_link_codecs); |
|
|
|
|
|
|
|
|
|
static int __init snd_soc_init(void) |
|
|
|
|
{ |
|
|
|
|
#ifdef CONFIG_DEBUG_FS |
|
|
|
|
snd_soc_debugfs_root = debugfs_create_dir("asoc", NULL); |
|
|
|
|
if (IS_ERR(snd_soc_debugfs_root) || !snd_soc_debugfs_root) { |
|
|
|
|
pr_warn("ASoC: Failed to create debugfs directory\n"); |
|
|
|
|
snd_soc_debugfs_root = NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!debugfs_create_file("codecs", 0444, snd_soc_debugfs_root, NULL, |
|
|
|
|
&codec_list_fops)) |
|
|
|
|
pr_warn("ASoC: Failed to create CODEC list debugfs file\n"); |
|
|
|
|
|
|
|
|
|
if (!debugfs_create_file("dais", 0444, snd_soc_debugfs_root, NULL, |
|
|
|
|
&dai_list_fops)) |
|
|
|
|
pr_warn("ASoC: Failed to create DAI list debugfs file\n"); |
|
|
|
|
|
|
|
|
|
if (!debugfs_create_file("platforms", 0444, snd_soc_debugfs_root, NULL, |
|
|
|
|
&platform_list_fops)) |
|
|
|
|
pr_warn("ASoC: Failed to create platform list debugfs file\n"); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
snd_soc_debugfs_init(); |
|
|
|
|
snd_soc_util_init(); |
|
|
|
|
|
|
|
|
|
return platform_driver_register(&soc_driver); |
|
|
|
@ -3624,9 +3632,9 @@ module_init(snd_soc_init); |
|
|
|
|
static void __exit snd_soc_exit(void) |
|
|
|
|
{ |
|
|
|
|
snd_soc_util_exit(); |
|
|
|
|
snd_soc_debugfs_exit(); |
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_DEBUG_FS |
|
|
|
|
debugfs_remove_recursive(snd_soc_debugfs_root); |
|
|
|
|
#endif |
|
|
|
|
platform_driver_unregister(&soc_driver); |
|
|
|
|
} |
|
|
|
|