[alsa-devel] [PATCH] ASoC: Ensure we generate a driver name
Commit 873bd4c (ASoC: Don't set invalid name string to snd_card->driver field) broke generation of a driver name for all ASoC cards relying on the automatic generation of one. Fix this by using the old default with spaces replaced by underscores.
Signed-off-by: Mark Brown broonie@opensource.wolfsonmicro.com --- sound/soc/soc-core.c | 17 ++++++++++++++--- 1 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 10e5cde..3096c0d 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -30,6 +30,7 @@ #include <linux/bitops.h> #include <linux/debugfs.h> #include <linux/platform_device.h> +#include <linux/ctype.h> #include <linux/slab.h> #include <sound/ac97_codec.h> #include <sound/core.h> @@ -1432,9 +1433,19 @@ static void snd_soc_instantiate_card(struct snd_soc_card *card) "%s", card->name); snprintf(card->snd_card->longname, sizeof(card->snd_card->longname), "%s", card->long_name ? card->long_name : card->name); - if (card->driver_name) - strlcpy(card->snd_card->driver, card->driver_name, - sizeof(card->snd_card->driver)); + snprintf(card->snd_card->driver, sizeof(card->snd_card->driver), + "%s", card->driver_name ? card->driver_name : card->name); + for (i = 0; i < ARRAY_SIZE(card->snd_card->driver); i++) { + switch (card->snd_card->driver[i]) { + case '_': + case '-': + break; + default: + if (!isalnum(card->snd_card->driver[i])) + card->snd_card->driver[i] = '_'; + break; + } + }
if (card->late_probe) { ret = card->late_probe(card);
At Tue, 20 Sep 2011 13:58:34 +0100, Mark Brown wrote:
Commit 873bd4c (ASoC: Don't set invalid name string to snd_card->driver field) broke generation of a driver name for all ASoC cards relying on the automatic generation of one. Fix this by using the old default with spaces replaced by underscores.
Signed-off-by: Mark Brown broonie@opensource.wolfsonmicro.com
sound/soc/soc-core.c | 17 ++++++++++++++--- 1 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 10e5cde..3096c0d 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -30,6 +30,7 @@ #include <linux/bitops.h> #include <linux/debugfs.h> #include <linux/platform_device.h> +#include <linux/ctype.h> #include <linux/slab.h> #include <sound/ac97_codec.h> #include <sound/core.h> @@ -1432,9 +1433,19 @@ static void snd_soc_instantiate_card(struct snd_soc_card *card) "%s", card->name); snprintf(card->snd_card->longname, sizeof(card->snd_card->longname), "%s", card->long_name ? card->long_name : card->name);
- if (card->driver_name)
strlcpy(card->snd_card->driver, card->driver_name,
sizeof(card->snd_card->driver));
- snprintf(card->snd_card->driver, sizeof(card->snd_card->driver),
"%s", card->driver_name ? card->driver_name : card->name);
- for (i = 0; i < ARRAY_SIZE(card->snd_card->driver); i++) {
Should check card->snd_card->driver[i] != 0 here, too.
thanks,
Takashi
switch (card->snd_card->driver[i]) {
case '_':
case '-':
break;
default:
if (!isalnum(card->snd_card->driver[i]))
card->snd_card->driver[i] = '_';
break;
}
}
if (card->late_probe) { ret = card->late_probe(card);
-- 1.7.6.3
On Tue, Sep 20, 2011 at 03:11:08PM +0200, Takashi Iwai wrote:
Mark Brown wrote:
- snprintf(card->snd_card->driver, sizeof(card->snd_card->driver),
"%s", card->driver_name ? card->driver_name : card->name);
- for (i = 0; i < ARRAY_SIZE(card->snd_card->driver); i++) {
Should check card->snd_card->driver[i] != 0 here, too.
*sigh* This sort of issue is why I'd prefer to just squash specific characters, especially given that we're just being random about what a valid character is.
At Tue, 20 Sep 2011 14:18:05 +0100, Mark Brown wrote:
On Tue, Sep 20, 2011 at 03:11:08PM +0200, Takashi Iwai wrote:
Mark Brown wrote:
- snprintf(card->snd_card->driver, sizeof(card->snd_card->driver),
"%s", card->driver_name ? card->driver_name : card->name);
- for (i = 0; i < ARRAY_SIZE(card->snd_card->driver); i++) {
Should check card->snd_card->driver[i] != 0 here, too.
*sigh* This sort of issue is why I'd prefer to just squash specific characters, especially given that we're just being random about what a valid character is.
Heh. Or just use a char *, such as
char *p; ... for (p = card->snd_card->driver; *p; p++) { if (*p != '_' && *p != '-' && !isalnum(*p)) *p = '_'; }
Takashi
On Tue, Sep 20, 2011 at 03:32:48PM +0200, Takashi Iwai wrote:
Mark Brown wrote:
*sigh* This sort of issue is why I'd prefer to just squash specific characters, especially given that we're just being random about what a valid character is.
Heh. Or just use a char *, such as
char *p; ... for (p = card->snd_card->driver; *p; p++) { if (*p != '_' && *p != '-' && !isalnum(*p)) *p = '_'; }
I find that a bit less legible, and I do like the ARRAY_SIZE() check for the warm and fuzzies. It's more just the listing all the characters bit. Anyway, is the last version OK for you?
At Tue, 20 Sep 2011 14:52:28 +0100, Mark Brown wrote:
On Tue, Sep 20, 2011 at 03:32:48PM +0200, Takashi Iwai wrote:
Mark Brown wrote:
*sigh* This sort of issue is why I'd prefer to just squash specific characters, especially given that we're just being random about what a valid character is.
Heh. Or just use a char *, such as
char *p; ... for (p = card->snd_card->driver; *p; p++) { if (*p != '_' && *p != '-' && !isalnum(*p)) *p = '_'; }
I find that a bit less legible, and I do like the ARRAY_SIZE() check for the warm and fuzzies. It's more just the listing all the characters bit. Anyway, is the last version OK for you?
Yeah, take my ack if needed.
Acked-by: Takashi Iwai tiwai@suse.de
thanks,
Takashi
participants (2)
-
Mark Brown
-
Takashi Iwai