diff mbox

[1/7] ASoC: fix debugfs directory creation bug

Message ID E1X0AZe-0003i7-0z@rmk-PC.arm.linux.org.uk (mailing list archive)
State Accepted
Commit e73f3de5c5eb5285a1b1d8eed111eb229702b20f
Headers show

Commit Message

Russell King June 26, 2014, 2:22 p.m. UTC
Avoid creating duplicate directories by prefixing codecs and platforms
with their separate identifiers.  This avoids snd-soc-dummy (which can
appear both as a dummy platform and a dummy codec on the same card)
from clashing.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
---
 sound/soc/soc-core.c | 28 ++++++++++++++++++++++++----
 1 file changed, 24 insertions(+), 4 deletions(-)

Comments

Lars-Peter Clausen June 27, 2014, 2:45 a.m. UTC | #1
On 06/26/2014 04:22 PM, Russell King wrote:
> Avoid creating duplicate directories by prefixing codecs and platforms
> with their separate identifiers.  This avoids snd-soc-dummy (which can
> appear both as a dummy platform and a dummy codec on the same card)
> from clashing.

Do we actually want to create debugfs entries for the snd-soc-dummies? There 
shouldn't be any meaningful information in there.

If we want to and if we change the naming scheme of the debugfs entries 
anyway we should also add the component name to the entry name. This fixes a 
issue with devices that register multiple components.

The other thing is that we are working on generalizing the ASoC code and 
getting rid of the distinction between CODECs and platforms. Which means 
there won't really a way to get the prefix anymore soon.

- Lars

>
> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
> ---
>   sound/soc/soc-core.c | 28 ++++++++++++++++++++++++----
>   1 file changed, 24 insertions(+), 4 deletions(-)
>
> diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
> index b87d7d882e6d..91120b8e283e 100644
> --- a/sound/soc/soc-core.c
> +++ b/sound/soc/soc-core.c
> @@ -270,12 +270,32 @@ static const struct file_operations codec_reg_fops = {
>   	.llseek = default_llseek,
>   };
>
> +static struct dentry *soc_debugfs_create_dir(struct dentry *parent,
> +	const char *fmt, ...)
> +{
> +	struct dentry *de;
> +	va_list ap;
> +	char *s;
> +
> +	va_start(ap, fmt);
> +	s = kvasprintf(GFP_KERNEL, fmt, ap);
> +	va_end(ap);
> +
> +	if (!s)
> +		return NULL;
> +
> +	de = debugfs_create_dir(s, parent);
> +	kfree(s);
> +
> +	return de;
> +}
> +
>   static void soc_init_codec_debugfs(struct snd_soc_codec *codec)
>   {
>   	struct dentry *debugfs_card_root = codec->card->debugfs_card_root;
>
> -	codec->debugfs_codec_root = debugfs_create_dir(codec->name,
> -						       debugfs_card_root);
> +	codec->debugfs_codec_root = soc_debugfs_create_dir(debugfs_card_root,
> +						"codec:%s", codec->name);
>   	if (!codec->debugfs_codec_root) {
>   		dev_warn(codec->dev,
>   			"ASoC: Failed to create codec debugfs directory\n");
> @@ -306,8 +326,8 @@ static void soc_init_platform_debugfs(struct snd_soc_platform *platform)
>   {
>   	struct dentry *debugfs_card_root = platform->card->debugfs_card_root;
>
> -	platform->debugfs_platform_root = debugfs_create_dir(platform->name,
> -						       debugfs_card_root);
> +	platform->debugfs_platform_root = soc_debugfs_create_dir(debugfs_card_root,
> +						"platform:%s", platform->name);
>   	if (!platform->debugfs_platform_root) {
>   		dev_warn(platform->dev,
>   			"ASoC: Failed to create platform debugfs directory\n");
>
Mark Brown June 28, 2014, 12:46 p.m. UTC | #2
On Fri, Jun 27, 2014 at 04:45:11AM +0200, Lars-Peter Clausen wrote:
> On 06/26/2014 04:22 PM, Russell King wrote:
> >Avoid creating duplicate directories by prefixing codecs and platforms
> >with their separate identifiers.  This avoids snd-soc-dummy (which can
> >appear both as a dummy platform and a dummy codec on the same card)
> >from clashing.

> Do we actually want to create debugfs entries for the snd-soc-dummies? There
> shouldn't be any meaningful information in there.

On the one hand they're virtual things that we probably should be hiding
but then again part of what we're trying to do is stub things out as
they would be normally so special casing potentically causes problems.

> If we want to and if we change the naming scheme of the debugfs entries
> anyway we should also add the component name to the entry name. This fixes a
> issue with devices that register multiple components.

> The other thing is that we are working on generalizing the ASoC code and
> getting rid of the distinction between CODECs and platforms. Which means
> there won't really a way to get the prefix anymore soon.

Right, these are both issues.  However I think the patch is OK for now,
it does avoid an actual problem so I'll apply it for now - we can
further improve it later.
diff mbox

Patch

diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index b87d7d882e6d..91120b8e283e 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -270,12 +270,32 @@  static const struct file_operations codec_reg_fops = {
 	.llseek = default_llseek,
 };
 
+static struct dentry *soc_debugfs_create_dir(struct dentry *parent,
+	const char *fmt, ...)
+{
+	struct dentry *de;
+	va_list ap;
+	char *s;
+
+	va_start(ap, fmt);
+	s = kvasprintf(GFP_KERNEL, fmt, ap);
+	va_end(ap);
+
+	if (!s)
+		return NULL;
+
+	de = debugfs_create_dir(s, parent);
+	kfree(s);
+
+	return de;
+}
+
 static void soc_init_codec_debugfs(struct snd_soc_codec *codec)
 {
 	struct dentry *debugfs_card_root = codec->card->debugfs_card_root;
 
-	codec->debugfs_codec_root = debugfs_create_dir(codec->name,
-						       debugfs_card_root);
+	codec->debugfs_codec_root = soc_debugfs_create_dir(debugfs_card_root,
+						"codec:%s", codec->name);
 	if (!codec->debugfs_codec_root) {
 		dev_warn(codec->dev,
 			"ASoC: Failed to create codec debugfs directory\n");
@@ -306,8 +326,8 @@  static void soc_init_platform_debugfs(struct snd_soc_platform *platform)
 {
 	struct dentry *debugfs_card_root = platform->card->debugfs_card_root;
 
-	platform->debugfs_platform_root = debugfs_create_dir(platform->name,
-						       debugfs_card_root);
+	platform->debugfs_platform_root = soc_debugfs_create_dir(debugfs_card_root,
+						"platform:%s", platform->name);
 	if (!platform->debugfs_platform_root) {
 		dev_warn(platform->dev,
 			"ASoC: Failed to create platform debugfs directory\n");