diff options
author | Georg Chini <georg.chini@triaton-webhosting.com> | 2007-01-03 00:28:17 -0500 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-01-03 21:37:26 -0500 |
commit | d35a1b9e10481c9f1d3b87e778a0f1f6a0a2dd48 (patch) | |
tree | fb110100baeafa0fc20a1849c74ca572a0458808 | |
parent | a7ec3f5289681e9d63b65db5f56857f998812b4b (diff) |
[SOUND] Sparc CS4231: Fix IRQ return value and initialization.
SBUS: Change IRQ-handler return value from 0 to IRQ_HANDLED and
fix some initialisation problems.
Change period_bytes_min from 4096 to 256 to allow driver to work with
low latency (VOIP) applications. Hope this does not break EBUS.
Signed-off-by: Georg Chini <georg.chini@triaton-webhosting.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | sound/sparc/cs4231.c | 26 |
1 files changed, 12 insertions, 14 deletions
diff --git a/sound/sparc/cs4231.c b/sound/sparc/cs4231.c index edeb3d3c4c7e..78c412ae2234 100644 --- a/sound/sparc/cs4231.c +++ b/sound/sparc/cs4231.c | |||
@@ -1268,7 +1268,7 @@ static struct snd_pcm_hardware snd_cs4231_playback = | |||
1268 | .channels_min = 1, | 1268 | .channels_min = 1, |
1269 | .channels_max = 2, | 1269 | .channels_max = 2, |
1270 | .buffer_bytes_max = (32*1024), | 1270 | .buffer_bytes_max = (32*1024), |
1271 | .period_bytes_min = 4096, | 1271 | .period_bytes_min = 256, |
1272 | .period_bytes_max = (32*1024), | 1272 | .period_bytes_max = (32*1024), |
1273 | .periods_min = 1, | 1273 | .periods_min = 1, |
1274 | .periods_max = 1024, | 1274 | .periods_max = 1024, |
@@ -1288,7 +1288,7 @@ static struct snd_pcm_hardware snd_cs4231_capture = | |||
1288 | .channels_min = 1, | 1288 | .channels_min = 1, |
1289 | .channels_max = 2, | 1289 | .channels_max = 2, |
1290 | .buffer_bytes_max = (32*1024), | 1290 | .buffer_bytes_max = (32*1024), |
1291 | .period_bytes_min = 4096, | 1291 | .period_bytes_min = 256, |
1292 | .period_bytes_max = (32*1024), | 1292 | .period_bytes_max = (32*1024), |
1293 | .periods_min = 1, | 1293 | .periods_min = 1, |
1294 | .periods_max = 1024, | 1294 | .periods_max = 1024, |
@@ -1796,7 +1796,7 @@ static irqreturn_t snd_cs4231_sbus_interrupt(int irq, void *dev_id) | |||
1796 | snd_cs4231_outm(chip, CS4231_IRQ_STATUS, ~CS4231_ALL_IRQS | ~status, 0); | 1796 | snd_cs4231_outm(chip, CS4231_IRQ_STATUS, ~CS4231_ALL_IRQS | ~status, 0); |
1797 | spin_unlock_irqrestore(&chip->lock, flags); | 1797 | spin_unlock_irqrestore(&chip->lock, flags); |
1798 | 1798 | ||
1799 | return 0; | 1799 | return IRQ_HANDLED; |
1800 | } | 1800 | } |
1801 | 1801 | ||
1802 | /* | 1802 | /* |
@@ -1821,7 +1821,6 @@ static int sbus_dma_request(struct cs4231_dma_control *dma_cont, dma_addr_t bus_ | |||
1821 | if (!(csr & test)) | 1821 | if (!(csr & test)) |
1822 | goto out; | 1822 | goto out; |
1823 | err = -EBUSY; | 1823 | err = -EBUSY; |
1824 | csr = sbus_readl(base->regs + APCCSR); | ||
1825 | test = APC_XINT_CNVA; | 1824 | test = APC_XINT_CNVA; |
1826 | if ( base->dir == APC_PLAY ) | 1825 | if ( base->dir == APC_PLAY ) |
1827 | test = APC_XINT_PNVA; | 1826 | test = APC_XINT_PNVA; |
@@ -1862,17 +1861,16 @@ static void sbus_dma_enable(struct cs4231_dma_control *dma_cont, int on) | |||
1862 | 1861 | ||
1863 | spin_lock_irqsave(&base->lock, flags); | 1862 | spin_lock_irqsave(&base->lock, flags); |
1864 | if (!on) { | 1863 | if (!on) { |
1865 | if (base->dir == APC_PLAY) { | 1864 | sbus_writel(0, base->regs + base->dir + APCNC); |
1866 | sbus_writel(0, base->regs + base->dir + APCNVA); | 1865 | sbus_writel(0, base->regs + base->dir + APCNVA); |
1867 | sbus_writel(1, base->regs + base->dir + APCC); | 1866 | sbus_writel(0, base->regs + base->dir + APCC); |
1868 | } | 1867 | sbus_writel(0, base->regs + base->dir + APCVA); |
1869 | else | 1868 | |
1870 | { | 1869 | /* ACK any APC interrupts. */ |
1871 | sbus_writel(0, base->regs + base->dir + APCNC); | 1870 | csr = sbus_readl(base->regs + APCCSR); |
1872 | sbus_writel(0, base->regs + base->dir + APCVA); | 1871 | sbus_writel(csr, base->regs + APCCSR); |
1873 | } | ||
1874 | } | 1872 | } |
1875 | udelay(600); | 1873 | udelay(1000); |
1876 | csr = sbus_readl(base->regs + APCCSR); | 1874 | csr = sbus_readl(base->regs + APCCSR); |
1877 | shift = 0; | 1875 | shift = 0; |
1878 | if ( base->dir == APC_PLAY ) | 1876 | if ( base->dir == APC_PLAY ) |