|
@@ -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"
|
|
@@ -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);
|