All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] ALSA: hdsp - poll for iobox
@ 2009-02-20 18:30 Tim Blechmann
  2009-02-23  8:58 ` Takashi Iwai
  0 siblings, 1 reply; 2+ messages in thread
From: Tim Blechmann @ 2009-02-20 18:30 UTC (permalink / raw)
  To: alsa-devel

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>
---
 sound/pci/rme9652/hdsp.c |   26 ++++++++++++++++++++++----
 1 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/sound/pci/rme9652/hdsp.c b/sound/pci/rme9652/hdsp.c
index 44d0c15..a586a80 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,27 @@ 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) {
@@ -5055,10 +5074,9 @@ 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;
 
-- 
1.6.1.2

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] ALSA: hdsp - poll for iobox
  2009-02-20 18:30 [PATCH] ALSA: hdsp - poll for iobox Tim Blechmann
@ 2009-02-23  8:58 ` Takashi Iwai
  0 siblings, 0 replies; 2+ messages in thread
From: Takashi Iwai @ 2009-02-23  8:58 UTC (permalink / raw)
  To: Tim Blechmann; +Cc: alsa-devel

At Fri, 20 Feb 2009 19:30:35 +0100,
Tim Blechmann wrote:
> 
> 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>

Applied both patches.  I fixed a few coding issues with the first one.

Thanks.


Takashi

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2009-02-23  8:58 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-02-20 18:30 [PATCH] ALSA: hdsp - poll for iobox Tim Blechmann
2009-02-23  8:58 ` Takashi Iwai

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.