diff mbox series

[RFC,12/15] ALSA: usb: Export card-naming procedure

Message ID 20250409110731.3752332-13-cezary.rojewski@intel.com (mailing list archive)
State RFC
Headers show
Series ALSA/ASoC: USB Audio Offload | expand

Commit Message

Cezary Rojewski April 9, 2025, 11:07 a.m. UTC
USB sound card features customized naming procedure. For ALSA and ASoC
drivers to share UseCaseManagement (UCM) configuration files, it is best
if the naming is aligned between the two.

Signed-off-by: Cezary Rojewski <cezary.rojewski@intel.com>
---
 include/sound/usb.h |  1 +
 sound/usb/card.c    | 78 ++++++++++++++++++++++-----------------------
 2 files changed, 39 insertions(+), 40 deletions(-)
diff mbox series

Patch

diff --git a/include/sound/usb.h b/include/sound/usb.h
index fbcfa2b985f7..b20badfda6a6 100644
--- a/include/sound/usb.h
+++ b/include/sound/usb.h
@@ -91,6 +91,7 @@  struct snd_usb_audio {
 };
 
 void snd_usb_release_resources(struct snd_usb_audio *chip);
+void snd_usb_make_card_names(struct snd_usb_audio *chip, char *shortname, char *longname);
 int snd_usb_bind_card(struct snd_usb_audio *chip, struct snd_card *card,
 		      struct usb_driver *driver);
 int snd_usb_bind_pcm(struct list_head *stream_entry, struct snd_pcm *pcm);
diff --git a/sound/usb/card.c b/sound/usb/card.c
index a4bd8ba6a26c..20a77e63a7eb 100644
--- a/sound/usb/card.c
+++ b/sound/usb/card.c
@@ -525,103 +525,102 @@  lookup_device_name(u32 id)
 	return NULL;
 }
 
-static void usb_audio_make_shortname(struct usb_device *dev,
-				     struct snd_usb_audio *chip,
-				     const struct snd_usb_audio_quirk *quirk)
+static void snd_usb_make_card_shortname(struct snd_usb_audio *chip, char *shortname)
 {
-	struct snd_card *card = chip->card;
 	const struct usb_audio_device_name *preset;
+	struct usb_device *udev = chip->dev;
 	const char *s = NULL;
 
 	preset = lookup_device_name(chip->usb_id);
 	if (preset && preset->product_name)
 		s = preset->product_name;
-	else if (quirk && quirk->product_name)
-		s = quirk->product_name;
+	else if (chip->quirk && chip->quirk->product_name)
+		s = chip->quirk->product_name;
 	if (s && *s) {
-		strscpy(card->shortname, s, sizeof(card->shortname));
+		strscpy(shortname, s, sizeof_field(struct snd_card, shortname));
 		return;
 	}
 
 	/* retrieve the device string as shortname */
-	if (!dev->descriptor.iProduct ||
-	    usb_string(dev, dev->descriptor.iProduct,
-		       card->shortname, sizeof(card->shortname)) <= 0) {
+	if (!udev->descriptor.iProduct ||
+	    usb_string(udev, udev->descriptor.iProduct,
+		       shortname, sizeof_field(struct snd_card, shortname)) <= 0) {
 		/* no name available from anywhere, so use ID */
-		sprintf(card->shortname, "USB Device %#04x:%#04x",
+		sprintf(shortname, "USB Device %#04x:%#04x",
 			USB_ID_VENDOR(chip->usb_id),
 			USB_ID_PRODUCT(chip->usb_id));
 	}
 
-	strim(card->shortname);
+	strim(shortname);
 }
 
-static void usb_audio_make_longname(struct usb_device *dev,
-				    struct snd_usb_audio *chip,
-				    const struct snd_usb_audio_quirk *quirk)
+void snd_usb_make_card_names(struct snd_usb_audio *chip, char *shortname, char *longname)
 {
-	struct snd_card *card = chip->card;
 	const struct usb_audio_device_name *preset;
+	struct usb_device *udev = chip->dev;
 	const char *s = NULL;
 	int len;
 
+	snd_usb_make_card_shortname(chip, shortname);
+
 	preset = lookup_device_name(chip->usb_id);
 
 	/* shortcut - if any pre-defined string is given, use it */
 	if (preset && preset->profile_name)
 		s = preset->profile_name;
 	if (s && *s) {
-		strscpy(card->longname, s, sizeof(card->longname));
+		strscpy(longname, s, sizeof_field(struct snd_card, longname));
 		return;
 	}
 
 	if (preset && preset->vendor_name)
 		s = preset->vendor_name;
-	else if (quirk && quirk->vendor_name)
-		s = quirk->vendor_name;
-	*card->longname = 0;
+	else if (chip->quirk && chip->quirk->vendor_name)
+		s = chip->quirk->vendor_name;
+	*longname = 0;
 	if (s && *s) {
-		strscpy(card->longname, s, sizeof(card->longname));
+		strscpy(longname, s, sizeof_field(struct snd_card, longname));
 	} else {
 		/* retrieve the vendor and device strings as longname */
-		if (dev->descriptor.iManufacturer)
-			usb_string(dev, dev->descriptor.iManufacturer,
-				   card->longname, sizeof(card->longname));
+		if (udev->descriptor.iManufacturer)
+			usb_string(udev, udev->descriptor.iManufacturer,
+				   longname, sizeof_field(struct snd_card, longname));
 		/* we don't really care if there isn't any vendor string */
 	}
-	if (*card->longname) {
-		strim(card->longname);
-		if (*card->longname)
-			strlcat(card->longname, " ", sizeof(card->longname));
+	if (*longname) {
+		strim(longname);
+		if (*longname)
+			strlcat(longname, " ", sizeof_field(struct snd_card, longname));
 	}
 
-	strlcat(card->longname, card->shortname, sizeof(card->longname));
+	strlcat(longname, shortname, sizeof_field(struct snd_card, longname));
 
-	len = strlcat(card->longname, " at ", sizeof(card->longname));
+	len = strlcat(longname, " at ", sizeof_field(struct snd_card, longname));
 
-	if (len < sizeof(card->longname))
-		usb_make_path(dev, card->longname + len, sizeof(card->longname) - len);
+	if (len < sizeof_field(struct snd_card, longname))
+		usb_make_path(udev, longname + len, sizeof_field(struct snd_card, longname) - len);
 
-	switch (snd_usb_get_speed(dev)) {
+	switch (snd_usb_get_speed(udev)) {
 	case USB_SPEED_LOW:
-		strlcat(card->longname, ", low speed", sizeof(card->longname));
+		strlcat(longname, ", low speed", sizeof_field(struct snd_card, longname));
 		break;
 	case USB_SPEED_FULL:
-		strlcat(card->longname, ", full speed", sizeof(card->longname));
+		strlcat(longname, ", full speed", sizeof_field(struct snd_card, longname));
 		break;
 	case USB_SPEED_HIGH:
-		strlcat(card->longname, ", high speed", sizeof(card->longname));
+		strlcat(longname, ", high speed", sizeof_field(struct snd_card, longname));
 		break;
 	case USB_SPEED_SUPER:
-		strlcat(card->longname, ", super speed", sizeof(card->longname));
+		strlcat(longname, ", super speed", sizeof_field(struct snd_card, longname));
 		break;
 	case USB_SPEED_SUPER_PLUS:
-		strlcat(card->longname, ", super speed plus", sizeof(card->longname));
+		strlcat(longname, ", super speed plus", sizeof_field(struct snd_card, longname));
 		break;
 	default:
 		break;
 	}
 }
+EXPORT_SYMBOL_GPL(snd_usb_make_card_names);
 
 /* look for a matching quirk alias id */
 static bool get_alias_id(struct usb_device *dev, unsigned int *id)
@@ -1058,8 +1057,7 @@  static int snd_usb_create_card(struct snd_usb_audio *chip, struct usb_interface
 
 	chip->card = card;
 	strscpy(card->driver, "USB-Audio", sizeof(card->driver));
-	usb_audio_make_shortname(udev, chip, chip->quirk);
-	usb_audio_make_longname(udev, chip, chip->quirk);
+	snd_usb_make_card_names(chip, card->shortname, card->longname);
 	sprintf(component, "USB%04x:%04x", usb_device_vid(udev), usb_device_pid(udev));
 	snd_component_add(card, component);
 	snd_usb_audio_create_proc(chip);