|
@@ -32,6 +32,7 @@
|
|
|
#include <linux/platform_device.h>
|
|
|
#include <linux/ctype.h>
|
|
|
#include <linux/slab.h>
|
|
|
+#include <linux/of.h>
|
|
|
#include <sound/ac97_codec.h>
|
|
|
#include <sound/core.h>
|
|
|
#include <sound/jack.h>
|
|
@@ -3317,6 +3318,30 @@ found:
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(snd_soc_unregister_codec);
|
|
|
|
|
|
+/* Retrieve a card's name from device tree */
|
|
|
+int snd_soc_of_parse_card_name(struct snd_soc_card *card,
|
|
|
+ const char *propname)
|
|
|
+{
|
|
|
+ struct device_node *np = card->dev->of_node;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = of_property_read_string_index(np, propname, 0, &card->name);
|
|
|
+ /*
|
|
|
+ * EINVAL means the property does not exist. This is fine providing
|
|
|
+ * card->name was previously set, which is checked later in
|
|
|
+ * snd_soc_register_card.
|
|
|
+ */
|
|
|
+ if (ret < 0 && ret != -EINVAL) {
|
|
|
+ dev_err(card->dev,
|
|
|
+ "Property '%s' could not be read: %d\n",
|
|
|
+ propname, ret);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(snd_soc_of_parse_card_name);
|
|
|
+
|
|
|
static int __init snd_soc_init(void)
|
|
|
{
|
|
|
#ifdef CONFIG_DEBUG_FS
|