From d1d28500cccc269fdbf81ba33d7328d1d2c04b2f Mon Sep 17 00:00:00 2001
From: Dylan Reid <dgreid@chromium.org>
Date: Thu, 14 Mar 2013 17:27:44 -0700
Subject: [PATCH] ALSA: hda/ca0132 - Check if dspload_image succeeded.
Git-commit: d1d28500cccc269fdbf81ba33d7328d1d2c04b2f
Patch-mainline: 3.9-rc3
References: bnc#814440,FATE#314291

If dspload_image() fails, it was ignored and dspload_wait_loaded() was
still called.  dsp_loaded should never be set to true in this case,
skip it.  The check in dspload_wait_loaded() return true if the DSP is
loaded or if it never started.

Signed-off-by: Dylan Reid <dgreid@chromium.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>

---
 sound/pci/hda/patch_ca0132.c |   15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

--- a/sound/pci/hda/patch_ca0132.c
+++ b/sound/pci/hda/patch_ca0132.c
@@ -4345,15 +4345,22 @@ static bool ca0132_download_dsp_images(s
 {
 	bool dsp_loaded = false;
 	const struct dsp_image_seg *dsp_os_image;
+	const struct firmware *fw_entry;
 
-	if (request_firmware_cached(&fw_efx, EFX_FILE,
-				    codec->bus->card->dev) != 0)
+	if (request_firmware(&fw_entry, EFX_FILE, codec->bus->card->dev) != 0)
 		return false;
 
-	dsp_os_image = (struct dsp_image_seg *)(fw_efx->data);
-	dspload_image(codec, dsp_os_image, 0, 0, true, 0);
+	dsp_os_image = (struct dsp_image_seg *)(fw_entry->data);
+	if (dspload_image(codec, dsp_os_image, 0, 0, true, 0)) {
+		pr_err("ca0132 dspload_image failed.\n");
+		goto exit_download;
+	}
+
 	dsp_loaded = dspload_wait_loaded(codec);
 
+exit_download:
+	release_firmware(fw_entry);
+
 	return dsp_loaded;
 }
 
