aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars-Peter Clausen <lars@metafoo.de>2014-08-19 09:51:18 -0400
committerMark Brown <broonie@linaro.org>2014-08-19 11:59:45 -0400
commit81c7cfd1b22a0ee5e40efef72ec2cd17dbf12e6d (patch)
treeeb779c384f13dfb84805675740287ba4809bf460
parent7d1311b93e58ed55f3a31cc8f94c4b8fe988a2b9 (diff)
ASoC: Move debugfs registration to the component level
The debugfs registration is mostly identical between platforms and CODECs. This patches consolidates the two implementations at the component level. Unfortunately there are still a couple of CODEC specific debugfs files that are related to legacy ASoC IO that need to be registered. For this a new callback is added to the component struct that will be initialized when a CODEC is registered and will be used to register the CODEC specific files. Once there are no drivers left using legacy IO this can be removed again. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> Signed-off-by: Mark Brown <broonie@linaro.org>
-rw-r--r--include/sound/soc.h20
-rw-r--r--sound/soc/soc-core.c122
2 files changed, 67 insertions, 75 deletions
diff --git a/include/sound/soc.h b/include/sound/soc.h
index be6ecae247b0..0ab8b1e4a5d2 100644
--- a/include/sound/soc.h
+++ b/include/sound/soc.h
@@ -728,9 +728,24 @@ struct snd_soc_component {
728 728
729 struct mutex io_mutex; 729 struct mutex io_mutex;
730 730
731#ifdef CONFIG_DEBUG_FS
732 struct dentry *debugfs_root;
733#endif
734
735 /*
736 * DO NOT use any of the fields below in drivers, they are temporary and
737 * are going to be removed again soon. If you use them in driver code the
738 * driver will be marked as BROKEN when these fields are removed.
739 */
740
731 /* Don't use these, use snd_soc_component_get_dapm() */ 741 /* Don't use these, use snd_soc_component_get_dapm() */
732 struct snd_soc_dapm_context dapm; 742 struct snd_soc_dapm_context dapm;
733 struct snd_soc_dapm_context *dapm_ptr; 743 struct snd_soc_dapm_context *dapm_ptr;
744
745#ifdef CONFIG_DEBUG_FS
746 void (*init_debugfs)(struct snd_soc_component *component);
747 const char *debugfs_prefix;
748#endif
734}; 749};
735 750
736/* SoC Audio Codec device */ 751/* SoC Audio Codec device */
@@ -766,7 +781,6 @@ struct snd_soc_codec {
766 struct snd_soc_dapm_context dapm; 781 struct snd_soc_dapm_context dapm;
767 782
768#ifdef CONFIG_DEBUG_FS 783#ifdef CONFIG_DEBUG_FS
769 struct dentry *debugfs_codec_root;
770 struct dentry *debugfs_reg; 784 struct dentry *debugfs_reg;
771#endif 785#endif
772}; 786};
@@ -879,10 +893,6 @@ struct snd_soc_platform {
879 struct list_head list; 893 struct list_head list;
880 894
881 struct snd_soc_component component; 895 struct snd_soc_component component;
882
883#ifdef CONFIG_DEBUG_FS
884 struct dentry *debugfs_platform_root;
885#endif
886}; 896};
887 897
888struct snd_soc_dai_link { 898struct snd_soc_dai_link {
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index d4bfd4a9076f..79371a77f324 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -270,79 +270,56 @@ static const struct file_operations codec_reg_fops = {
270 .llseek = default_llseek, 270 .llseek = default_llseek,
271}; 271};
272 272
273static struct dentry *soc_debugfs_create_dir(struct dentry *parent, 273static void soc_init_component_debugfs(struct snd_soc_component *component)
274 const char *fmt, ...)
275{ 274{
276 struct dentry *de; 275 if (component->debugfs_prefix) {
277 va_list ap; 276 char *name;
278 char *s;
279 277
280 va_start(ap, fmt); 278 name = kasprintf(GFP_KERNEL, "%s:%s",
281 s = kvasprintf(GFP_KERNEL, fmt, ap); 279 component->debugfs_prefix, component->name);
282 va_end(ap); 280 if (name) {
281 component->debugfs_root = debugfs_create_dir(name,
282 component->card->debugfs_card_root);
283 kfree(name);
284 }
285 } else {
286 component->debugfs_root = debugfs_create_dir(component->name,
287 component->card->debugfs_card_root);
288 }
283 289
284 if (!s) 290 if (!component->debugfs_root) {
285 return NULL; 291 dev_warn(component->dev,
292 "ASoC: Failed to create component debugfs directory\n");
293 return;
294 }
286 295
287 de = debugfs_create_dir(s, parent); 296 snd_soc_dapm_debugfs_init(snd_soc_component_get_dapm(component),
288 kfree(s); 297 component->debugfs_root);
289 298
290 return de; 299 if (component->init_debugfs)
300 component->init_debugfs(component);
291} 301}
292 302
293static void soc_init_codec_debugfs(struct snd_soc_codec *codec) 303static void soc_cleanup_component_debugfs(struct snd_soc_component *component)
294{ 304{
295 struct dentry *debugfs_card_root = codec->component.card->debugfs_card_root; 305 debugfs_remove_recursive(component->debugfs_root);
306}
296 307
297 codec->debugfs_codec_root = soc_debugfs_create_dir(debugfs_card_root, 308static void soc_init_codec_debugfs(struct snd_soc_component *component)
298 "codec:%s", 309{
299 codec->component.name); 310 struct snd_soc_codec *codec = snd_soc_component_to_codec(component);
300 if (!codec->debugfs_codec_root) {
301 dev_warn(codec->dev,
302 "ASoC: Failed to create codec debugfs directory\n");
303 return;
304 }
305 311
306 debugfs_create_bool("cache_sync", 0444, codec->debugfs_codec_root, 312 debugfs_create_bool("cache_sync", 0444, codec->component.debugfs_root,
307 &codec->cache_sync); 313 &codec->cache_sync);
308 debugfs_create_bool("cache_only", 0444, codec->debugfs_codec_root, 314 debugfs_create_bool("cache_only", 0444, codec->component.debugfs_root,
309 &codec->cache_only); 315 &codec->cache_only);
310 316
311 codec->debugfs_reg = debugfs_create_file("codec_reg", 0644, 317 codec->debugfs_reg = debugfs_create_file("codec_reg", 0644,
312 codec->debugfs_codec_root, 318 codec->component.debugfs_root,
313 codec, &codec_reg_fops); 319 codec, &codec_reg_fops);
314 if (!codec->debugfs_reg) 320 if (!codec->debugfs_reg)
315 dev_warn(codec->dev, 321 dev_warn(codec->dev,
316 "ASoC: Failed to create codec register debugfs file\n"); 322 "ASoC: Failed to create codec register debugfs file\n");
317
318 snd_soc_dapm_debugfs_init(&codec->dapm, codec->debugfs_codec_root);
319}
320
321static void soc_cleanup_codec_debugfs(struct snd_soc_codec *codec)
322{
323 debugfs_remove_recursive(codec->debugfs_codec_root);
324}
325
326static void soc_init_platform_debugfs(struct snd_soc_platform *platform)
327{
328 struct dentry *debugfs_card_root = platform->component.card->debugfs_card_root;
329
330 platform->debugfs_platform_root = soc_debugfs_create_dir(debugfs_card_root,
331 "platform:%s",
332 platform->component.name);
333 if (!platform->debugfs_platform_root) {
334 dev_warn(platform->dev,
335 "ASoC: Failed to create platform debugfs directory\n");
336 return;
337 }
338
339 snd_soc_dapm_debugfs_init(&platform->component.dapm,
340 platform->debugfs_platform_root);
341}
342
343static void soc_cleanup_platform_debugfs(struct snd_soc_platform *platform)
344{
345 debugfs_remove_recursive(platform->debugfs_platform_root);
346} 323}
347 324
348static ssize_t codec_list_read_file(struct file *file, char __user *user_buf, 325static ssize_t codec_list_read_file(struct file *file, char __user *user_buf,
@@ -474,19 +451,15 @@ static void soc_cleanup_card_debugfs(struct snd_soc_card *card)
474 451
475#else 452#else
476 453
477static inline void soc_init_codec_debugfs(struct snd_soc_codec *codec) 454#define soc_init_codec_debugfs NULL
478{
479}
480 455
481static inline void soc_cleanup_codec_debugfs(struct snd_soc_codec *codec) 456static inline void soc_init_component_debugfs(
457 struct snd_soc_component *component)
482{ 458{
483} 459}
484 460
485static inline void soc_init_platform_debugfs(struct snd_soc_platform *platform) 461static inline void soc_cleanup_component_debugfs(
486{ 462 struct snd_soc_component *component)
487}
488
489static inline void soc_cleanup_platform_debugfs(struct snd_soc_platform *platform)
490{ 463{
491} 464}
492 465
@@ -1026,7 +999,7 @@ static int soc_remove_platform(struct snd_soc_platform *platform)
1026 /* Make sure all DAPM widgets are freed */ 999 /* Make sure all DAPM widgets are freed */
1027 snd_soc_dapm_free(&platform->component.dapm); 1000 snd_soc_dapm_free(&platform->component.dapm);
1028 1001
1029 soc_cleanup_platform_debugfs(platform); 1002 soc_cleanup_component_debugfs(&platform->component);
1030 platform->probed = 0; 1003 platform->probed = 0;
1031 module_put(platform->dev->driver->owner); 1004 module_put(platform->dev->driver->owner);
1032 1005
@@ -1046,7 +1019,7 @@ static void soc_remove_codec(struct snd_soc_codec *codec)
1046 /* Make sure all DAPM widgets are freed */ 1019 /* Make sure all DAPM widgets are freed */
1047 snd_soc_dapm_free(&codec->dapm); 1020 snd_soc_dapm_free(&codec->dapm);
1048 1021
1049 soc_cleanup_codec_debugfs(codec); 1022 soc_cleanup_component_debugfs(&codec->component);
1050 codec->probed = 0; 1023 codec->probed = 0;
1051 list_del(&codec->card_list); 1024 list_del(&codec->card_list);
1052 module_put(codec->dev->driver->owner); 1025 module_put(codec->dev->driver->owner);
@@ -1187,7 +1160,7 @@ static int soc_probe_codec(struct snd_soc_card *card,
1187 if (!try_module_get(codec->dev->driver->owner)) 1160 if (!try_module_get(codec->dev->driver->owner))
1188 return -ENODEV; 1161 return -ENODEV;
1189 1162
1190 soc_init_codec_debugfs(codec); 1163 soc_init_component_debugfs(&codec->component);
1191 1164
1192 if (driver->dapm_widgets) { 1165 if (driver->dapm_widgets) {
1193 ret = snd_soc_dapm_new_controls(&codec->dapm, 1166 ret = snd_soc_dapm_new_controls(&codec->dapm,
@@ -1242,7 +1215,7 @@ static int soc_probe_codec(struct snd_soc_card *card,
1242 return 0; 1215 return 0;
1243 1216
1244err_probe: 1217err_probe:
1245 soc_cleanup_codec_debugfs(codec); 1218 soc_cleanup_component_debugfs(&codec->component);
1246 module_put(codec->dev->driver->owner); 1219 module_put(codec->dev->driver->owner);
1247 1220
1248 return ret; 1221 return ret;
@@ -1262,7 +1235,7 @@ static int soc_probe_platform(struct snd_soc_card *card,
1262 if (!try_module_get(platform->dev->driver->owner)) 1235 if (!try_module_get(platform->dev->driver->owner))
1263 return -ENODEV; 1236 return -ENODEV;
1264 1237
1265 soc_init_platform_debugfs(platform); 1238 soc_init_component_debugfs(&platform->component);
1266 1239
1267 if (driver->dapm_widgets) 1240 if (driver->dapm_widgets)
1268 snd_soc_dapm_new_controls(&platform->component.dapm, 1241 snd_soc_dapm_new_controls(&platform->component.dapm,
@@ -1302,7 +1275,7 @@ static int soc_probe_platform(struct snd_soc_card *card,
1302 return 0; 1275 return 0;
1303 1276
1304err_probe: 1277err_probe:
1305 soc_cleanup_platform_debugfs(platform); 1278 soc_cleanup_component_debugfs(&platform->component);
1306 module_put(platform->dev->driver->owner); 1279 module_put(platform->dev->driver->owner);
1307 1280
1308 return ret; 1281 return ret;
@@ -4266,6 +4239,10 @@ int snd_soc_add_platform(struct device *dev, struct snd_soc_platform *platform,
4266 if (platform_drv->read) 4239 if (platform_drv->read)
4267 platform->component.read = snd_soc_platform_drv_read; 4240 platform->component.read = snd_soc_platform_drv_read;
4268 4241
4242#ifdef CONFIG_DEBUG_FS
4243 platform->component.debugfs_prefix = "platform";
4244#endif
4245
4269 mutex_lock(&client_mutex); 4246 mutex_lock(&client_mutex);
4270 snd_soc_component_add_unlocked(&platform->component); 4247 snd_soc_component_add_unlocked(&platform->component);
4271 list_add(&platform->list, &platform_list); 4248 list_add(&platform->list, &platform_list);
@@ -4455,6 +4432,11 @@ int snd_soc_register_codec(struct device *dev,
4455 codec->component.val_bytes = codec_drv->reg_word_size; 4432 codec->component.val_bytes = codec_drv->reg_word_size;
4456 mutex_init(&codec->mutex); 4433 mutex_init(&codec->mutex);
4457 4434
4435#ifdef CONFIG_DEBUG_FS
4436 codec->component.init_debugfs = soc_init_codec_debugfs;
4437 codec->component.debugfs_prefix = "codec";
4438#endif
4439
4458 if (!codec->component.write) { 4440 if (!codec->component.write) {
4459 if (codec_drv->get_regmap) 4441 if (codec_drv->get_regmap)
4460 regmap = codec_drv->get_regmap(dev); 4442 regmap = codec_drv->get_regmap(dev);