summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Lang <joshualang@google.com>2016-06-17 17:30:55 -0700
committerJin Qian <jinqian@google.com>2016-11-17 12:26:52 -0800
commit18e334986224af1dc9d1a61dd8957f07919c76d0 (patch)
tree38aac54fb7e43209257d42d08d5034e542a3bde4
parent8bf12bc1b78dac6cb4fb7e4fbc0920978d17f5ea (diff)
ANDROID: goldfish_audio: Clear audio read buffer status after each read
The buffer_status field is interrupt updated. After every read request, the buffer_status read field should be reset so that on the next loop iteration we don't read a stale value and read data before the device is ready. Signed-off-by: “Joshua Lang” <joshualang@google.com> Change-Id: I4943d5aaada1cad9c7e59a94a87c387578dabe86
-rw-r--r--drivers/staging/goldfish/goldfish_audio.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/staging/goldfish/goldfish_audio.c b/drivers/staging/goldfish/goldfish_audio.c
index 83bbe459b93a..63b79c09b41b 100644
--- a/drivers/staging/goldfish/goldfish_audio.c
+++ b/drivers/staging/goldfish/goldfish_audio.c
@@ -117,6 +117,7 @@ static ssize_t goldfish_audio_read(struct file *fp, char __user *buf,
size_t count, loff_t *pos)
{
struct goldfish_audio *data = fp->private_data;
+ unsigned long irq_flags;
int length;
int result = 0;
@@ -130,6 +131,10 @@ static ssize_t goldfish_audio_read(struct file *fp, char __user *buf,
wait_event_interruptible(data->wait, data->buffer_status &
AUDIO_INT_READ_BUFFER_FULL);
+ spin_lock_irqsave(&data->lock, irq_flags);
+ data->buffer_status &= ~AUDIO_INT_READ_BUFFER_FULL;
+ spin_unlock_irqrestore(&data->lock, irq_flags);
+
length = AUDIO_READ(data, AUDIO_READ_BUFFER_AVAILABLE);
/* copy data to user space */