ANDROID: goldfish_audio: Clear audio read buffer status after each read
authorJoshua Lang <joshualang@google.com>
Sat, 18 Jun 2016 00:30:55 +0000 (17:30 -0700)
committerJin Qian <jinqian@google.com>
Thu, 17 Nov 2016 20:26:52 +0000 (12:26 -0800)
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

drivers/staging/goldfish/goldfish_audio.c

index 83bbe459b93a1274c676f04079f5f7b20ae39668..63b79c09b41ba2231b7a4b4c3beb644659d3fad4 100644 (file)
@@ -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 */