From 0e2ee5c4db0de18bd4925f9c8ee069cabb879785 Mon Sep 17 00:00:00 2001 From: Tim Blechmann Date: Fri, 20 Feb 2009 19:30:35 +0100 Subject: [PATCH] --- yaml --- r: 133142 b: refs/heads/master c: e588ed8304f76cbb396ee85e657a58990298a675 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/sound/pci/rme9652/hdsp.c | 29 +++++++++++++++++++++++++---- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index 47a21ea8f710..764d3b64eccc 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 66a101dda6b26ee566aa9cadcbea904a41d2b268 +refs/heads/master: e588ed8304f76cbb396ee85e657a58990298a675 diff --git a/trunk/sound/pci/rme9652/hdsp.c b/trunk/sound/pci/rme9652/hdsp.c index bacfdd12619b..12c6b4305ec1 100644 --- a/trunk/sound/pci/rme9652/hdsp.c +++ b/trunk/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;