]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - sound/pci/hda/hda_hwdep.c
Merge tag 'sound-3.7' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
[karo-tx-linux.git] / sound / pci / hda / hda_hwdep.c
index 6b2efb8cb1f9c6bded4e7d318467f8825be75903..1af86d40eb2396b7dde509052beb8b0180bd0f8e 100644 (file)
@@ -25,7 +25,6 @@
 #include <linux/mutex.h>
 #include <linux/ctype.h>
 #include <linux/string.h>
-#include <linux/firmware.h>
 #include <linux/export.h>
 #include <sound/core.h>
 #include "hda_codec.h"
@@ -156,7 +155,7 @@ int /*__devinit*/ snd_hda_create_hwdep(struct hda_codec *codec)
        return 0;
 }
 
-#ifdef CONFIG_SND_HDA_POWER_SAVE
+#ifdef CONFIG_PM
 static ssize_t power_on_acct_show(struct device *dev,
                                  struct device_attribute *attr,
                                  char *buf)
@@ -192,7 +191,7 @@ int snd_hda_hwdep_add_power_sysfs(struct hda_codec *codec)
                                          hwdep->device, &power_attrs[i]);
        return 0;
 }
-#endif /* CONFIG_SND_HDA_POWER_SAVE */
+#endif /* CONFIG_PM */
 
 #ifdef CONFIG_SND_HDA_RECONFIG
 
@@ -747,18 +746,21 @@ static int parse_line_mode(char *buf, struct hda_bus *bus)
  *
  * the spaces at the beginning and the end of the line are stripped
  */
-static int get_line_from_fw(char *buf, int size, struct firmware *fw)
+static int get_line_from_fw(char *buf, int size, size_t *fw_size_p,
+                           const void **fw_data_p)
 {
        int len;
-       const char *p = fw->data;
-       while (isspace(*p) && fw->size) {
+       size_t fw_size = *fw_size_p;
+       const char *p = *fw_data_p;
+
+       while (isspace(*p) && fw_size) {
                p++;
-               fw->size--;
+               fw_size--;
        }
-       if (!fw->size)
+       if (!fw_size)
                return 0;
 
-       for (len = 0; len < fw->size; len++) {
+       for (len = 0; len < fw_size; len++) {
                if (!*p)
                        break;
                if (*p == '\n') {
@@ -770,8 +772,8 @@ static int get_line_from_fw(char *buf, int size, struct firmware *fw)
                        *buf++ = *p++;
        }
        *buf = 0;
-       fw->size -= len;
-       fw->data = p;
+       *fw_size_p = fw_size - len;
+       *fw_data_p = p;
        remove_trail_spaces(buf);
        return 1;
 }
@@ -779,29 +781,15 @@ static int get_line_from_fw(char *buf, int size, struct firmware *fw)
 /*
  * load a "patch" firmware file and parse it
  */
-int snd_hda_load_patch(struct hda_bus *bus, const char *patch)
+int snd_hda_load_patch(struct hda_bus *bus, size_t fw_size, const void *fw_buf)
 {
-       int err;
-       const struct firmware *fw;
-       struct firmware tmp;
        char buf[128];
        struct hda_codec *codec;
        int line_mode;
-       struct device *dev = bus->card->dev;
-
-       if (snd_BUG_ON(!dev))
-               return -ENODEV;
-       err = request_firmware(&fw, patch, dev);
-       if (err < 0) {
-               printk(KERN_ERR "hda-codec: Cannot load the patch '%s'\n",
-                      patch);
-               return err;
-       }
 
-       tmp = *fw;
        line_mode = LINE_MODE_NONE;
        codec = NULL;
-       while (get_line_from_fw(buf, sizeof(buf) - 1, &tmp)) {
+       while (get_line_from_fw(buf, sizeof(buf) - 1, &fw_size, &fw_buf)) {
                if (!*buf || *buf == '#' || *buf == '\n')
                        continue;
                if (*buf == '[')
@@ -810,7 +798,6 @@ int snd_hda_load_patch(struct hda_bus *bus, const char *patch)
                         (codec || !patch_items[line_mode].need_codec))
                        patch_items[line_mode].parser(buf, bus, &codec);
        }
-       release_firmware(fw);
        return 0;
 }
 EXPORT_SYMBOL_HDA(snd_hda_load_patch);