diff options
author | Jaroslav Kysela <perex@perex.cz> | 2010-05-11 06:10:47 -0400 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2010-05-11 06:17:55 -0400 |
commit | f48f606d9f85a8b25c716082c73c36e9ff6f0cde (patch) | |
tree | 3c3cf4754a49d9bdc5f3bd648b53860dbc696ab5 /sound | |
parent | e54637205b00837bf00de916b0ae361c6aa0b139 (diff) |
[ALSA] snd-hda-intel: Improve azx_position_ok()
Add back the zero return value (activate workqueue) when
bdl_pos_adj is nonzero for position check.
Do the position related check only for first next period
using wallclk counter.
Return -1 value (ignore interrupt) when period_bytes
variable is zero.
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/pci/hda/hda_intel.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 0a6c55bb7d6b..170610e1d7da 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -1890,9 +1890,8 @@ static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev) | |||
1890 | unsigned int pos; | 1890 | unsigned int pos; |
1891 | int stream; | 1891 | int stream; |
1892 | 1892 | ||
1893 | wallclk = azx_readl(chip, WALLCLK); | 1893 | wallclk = azx_readl(chip, WALLCLK) - azx_dev->start_wallclk; |
1894 | if ((wallclk - azx_dev->start_wallclk) < | 1894 | if (wallclk < (azx_dev->period_wallclk * 2) / 3) |
1895 | (azx_dev->period_wallclk * 2) / 3) | ||
1896 | return -1; /* bogus (too early) interrupt */ | 1895 | return -1; /* bogus (too early) interrupt */ |
1897 | 1896 | ||
1898 | stream = azx_dev->substream->stream; | 1897 | stream = azx_dev->substream->stream; |
@@ -1910,9 +1909,11 @@ static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev) | |||
1910 | 1909 | ||
1911 | if (WARN_ONCE(!azx_dev->period_bytes, | 1910 | if (WARN_ONCE(!azx_dev->period_bytes, |
1912 | "hda-intel: zero azx_dev->period_bytes")) | 1911 | "hda-intel: zero azx_dev->period_bytes")) |
1913 | return 0; /* this shouldn't happen! */ | 1912 | return -1; /* this shouldn't happen! */ |
1914 | if (pos % azx_dev->period_bytes > azx_dev->period_bytes / 2) | 1913 | if (wallclk <= azx_dev->period_wallclk && |
1915 | return 0; /* NG - it's below the period boundary */ | 1914 | pos % azx_dev->period_bytes > azx_dev->period_bytes / 2) |
1915 | /* NG - it's below the first next period boundary */ | ||
1916 | return bdl_pos_adj[chip->dev_index] ? 0 : -1; | ||
1916 | azx_dev->start_wallclk = wallclk; | 1917 | azx_dev->start_wallclk = wallclk; |
1917 | return 1; /* OK, it's fine */ | 1918 | return 1; /* OK, it's fine */ |
1918 | } | 1919 | } |