ALSA: hdsp - poll for iobox

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Linux Kernel Mailing List
Date: Thursday, March 26, 2009 - 12:17 pm

Gitweb:     http://git.kernel.org/linus/e588ed8304f76cbb396ee85e657a58990298a675
Commit:     e588ed8304f76cbb396ee85e657a58990298a675
Parent:     66a101dda6b26ee566aa9cadcbea904a41d2b268
Author:     Tim Blechmann <tim@klingt.org>
AuthorDate: Fri Feb 20 19:30:35 2009 +0100
Committer:  Takashi Iwai <tiwai@suse.de>
CommitDate: Mon Feb 23 08:20:01 2009 +0100

    ALSA: hdsp - poll for iobox
    
    sleeping for 2 seconds before checking for the iobox is not enough
    on some systems.
    this patch increases the timeout, but polls the card during that
    time. it thus speeds up the module loading when the card has already
    been initialized, while being more robust on systems, which require
    a higher timeout than the predefined 2 seconds.
    
    Signed-off-by: Tim Blechmann <tim@klingt.org>
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
 sound/pci/rme9652/hdsp.c |   29 +++++++++++++++++++++++++----
 1 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/sound/pci/rme9652/hdsp.c b/sound/pci/rme9652/hdsp.c
index bacfdd1..12c6b43 100644
--- a/sound/pci/rme9652/hdsp.c
+++ b/sound/pci/rme9652/hdsp.c
@@ -653,7 +653,6 @@ static unsigned int hdsp_read(struct hdsp *hdsp, int reg)
 
 static int hdsp_check_for_iobox (struct hdsp *hdsp)
 {
-
 	if (hdsp->io_type == H9652 || hdsp->io_type == H9632) return 0;
 	if (hdsp_read (hdsp, HDSP_statusRegister) & HDSP_ConfigError) {
 		snd_printk ("Hammerfall-DSP: no Digiface or Multiface connected!\n");
@@ -661,7 +660,29 @@ static int hdsp_check_for_iobox (struct hdsp *hdsp)
 		return -EIO;
 	}
 	return 0;
+}
 
+static int hdsp_wait_for_iobox(struct hdsp *hdsp, unsigned int loops,
+			       unsigned int delay)
+{
+	unsigned int i;
+
+	if (hdsp->io_type == H9652 || hdsp->io_type == H9632)
+		return 0;
+
+	for (i = 0; i != loops; ++i) {
+		if (hdsp_read(hdsp, HDSP_statusRegister) & HDSP_ConfigError)
+			msleep(delay);
+		else {
+			snd_printd("Hammerfall-DSP: iobox found after %ums!\n",
+				   i * delay);
+			return 0;
+		}
+	}
+
+	snd_printk("Hammerfall-DSP: no Digiface or Multiface connected!\n");
+	hdsp->state &= ~HDSP_FirmwareLoaded;
+	return -EIO;
 }
 
 static int snd_hdsp_load_firmware_from_cache(struct hdsp *hdsp) {
@@ -5046,10 +5067,10 @@ static int __devinit snd_hdsp_create(struct snd_card *card,
 		return err;
 	
 	if (!is_9652 && !is_9632) {
-		/* we wait 2 seconds to let freshly inserted cardbus cards do their hardware init */
-		ssleep(2);
+		/* we wait a maximum of 10 seconds to let freshly
+		 * inserted cardbus cards do their hardware init */
+		err = hdsp_wait_for_iobox(hdsp, 1000, 10);
 
-		err = hdsp_check_for_iobox(hdsp);
 		if (err < 0)
 			return err;
 
--
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
ALSA: hdsp - poll for iobox, Linux Kernel Mailing ..., (Thu Mar 26, 12:17 pm)