Skip to content

Commit

Permalink
ASoC: wm0010: Add checking for .dfw info record version.
Browse files Browse the repository at this point in the history
The info record at the start of the dsp firmware file has been
expanded to incorporate additional version information. We need
to check the version to make sure we understand the layout of
the information in the record. The srec2image tool is currently
used to create this record during creation of the .dfw file.

Signed-off-by: Scott Ling <sl@opensource.wolfsonmicro.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
  • Loading branch information
Scott Ling authored and Mark Brown committed Nov 23, 2012
1 parent 631fcab commit 68e1969
Showing 1 changed file with 24 additions and 1 deletion.
25 changes: 24 additions & 1 deletion sound/soc/codecs/wm0010.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@

#define DEVICE_ID_WM0010 10

/* We only support v1 of the .dfw INFO record */
#define INFO_VERSION 1

enum dfw_cmd {
DFW_CMD_FUSE = 0x01,
DFW_CMD_CODE_HDR,
Expand All @@ -46,6 +49,13 @@ struct dfw_binrec {
uint8_t data[0];
} __packed;

struct dfw_inforec {
u8 info_version;
u8 tool_major_version;
u8 tool_minor_version;
u8 dsp_target;
};

struct dfw_pllrec {
u8 command;
u32 length:24;
Expand Down Expand Up @@ -342,6 +352,7 @@ static int wm0010_firmware_load(char *name, struct snd_soc_codec *codec)
struct completion done;
const struct firmware *fw;
const struct dfw_binrec *rec;
const struct dfw_inforec *inforec;
u64 *img;
u8 *out, dsp;
u32 len, offset;
Expand All @@ -356,8 +367,9 @@ static int wm0010_firmware_load(char *name, struct snd_soc_codec *codec)
}

rec = (const struct dfw_binrec *)fw->data;
inforec = (const struct dfw_inforec *)rec->data;
offset = 0;
dsp = rec->data[0];
dsp = inforec->dsp_target;
wm0010->boot_failed = false;
BUG_ON(!list_empty(&xfer_list));
init_completion(&done);
Expand All @@ -369,6 +381,17 @@ static int wm0010_firmware_load(char *name, struct snd_soc_codec *codec)
goto abort;
}

if (inforec->info_version != INFO_VERSION) {
dev_err(codec->dev,
"Unsupported version (%02d) of INFO record\r\n",
inforec->info_version);
ret = -EINVAL;
goto abort;
}

dev_dbg(codec->dev, "Version v%02d INFO record found\r\n",
inforec->info_version);

/* Check it's a DSP file */
if (dsp != DEVICE_ID_WM0010) {
dev_err(codec->dev, "Not a WM0010 firmware file.\r\n");
Expand Down

0 comments on commit 68e1969

Please sign in to comment.