Skip to content
This repository was archived by the owner on Jul 3, 2018. It is now read-only.

Commit 82e96be

Browse files
lnxbuildGerrit - the friendly Code Review server
authored andcommitted
Merge "ASoC: msm: qdsp6v2: make audio debugfs read and release exclusive" into LA.BR.1.3.6_rb1.20
2 parents fc5eaf3 + 5c719ba commit 82e96be

File tree

1 file changed

+36
-22
lines changed

1 file changed

+36
-22
lines changed

drivers/misc/qcom/qdsp6v2/audio_utils_aio.c

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,14 @@
2727
#include <linux/msm_audio_ion.h>
2828
#include <linux/compat.h>
2929
#include <sound/q6core.h>
30+
#include <linux/mutex.h>
3031
#include "audio_utils_aio.h"
3132
#ifdef CONFIG_USE_DEV_CTRL_VOLUME
3233
#include <linux/qdsp6v2/audio_dev_ctl.h>
3334
#endif /*CONFIG_USE_DEV_CTRL_VOLUME*/
35+
DEFINE_MUTEX(lock);
3436
#ifdef CONFIG_DEBUG_FS
37+
3538
int audio_aio_debug_open(struct inode *inode, struct file *file)
3639
{
3740
file->private_data = inode->i_private;
@@ -44,29 +47,37 @@ ssize_t audio_aio_debug_read(struct file *file, char __user *buf,
4447
const int debug_bufmax = 4096;
4548
static char buffer[4096];
4649
int n = 0;
47-
struct q6audio_aio *audio = file->private_data;
50+
struct q6audio_aio *audio;
4851

49-
mutex_lock(&audio->lock);
50-
n = scnprintf(buffer, debug_bufmax, "opened %d\n", audio->opened);
51-
n += scnprintf(buffer + n, debug_bufmax - n,
52-
"enabled %d\n", audio->enabled);
53-
n += scnprintf(buffer + n, debug_bufmax - n,
54-
"stopped %d\n", audio->stopped);
55-
n += scnprintf(buffer + n, debug_bufmax - n,
56-
"feedback %d\n", audio->feedback);
57-
mutex_unlock(&audio->lock);
58-
/* Following variables are only useful for debugging when
59-
* when playback halts unexpectedly. Thus, no mutual exclusion
60-
* enforced
61-
*/
62-
n += scnprintf(buffer + n, debug_bufmax - n,
63-
"wflush %d\n", audio->wflush);
64-
n += scnprintf(buffer + n, debug_bufmax - n,
65-
"rflush %d\n", audio->rflush);
66-
n += scnprintf(buffer + n, debug_bufmax - n,
67-
"inqueue empty %d\n", list_empty(&audio->in_queue));
68-
n += scnprintf(buffer + n, debug_bufmax - n,
69-
"outqueue empty %d\n", list_empty(&audio->out_queue));
52+
mutex_lock(&lock);
53+
if (file->private_data != NULL) {
54+
audio = file->private_data;
55+
mutex_lock(&audio->lock);
56+
n = scnprintf(buffer, debug_bufmax, "opened %d\n",
57+
audio->opened);
58+
n += scnprintf(buffer + n, debug_bufmax - n,
59+
"enabled %d\n", audio->enabled);
60+
n += scnprintf(buffer + n, debug_bufmax - n,
61+
"stopped %d\n", audio->stopped);
62+
n += scnprintf(buffer + n, debug_bufmax - n,
63+
"feedback %d\n", audio->feedback);
64+
mutex_unlock(&audio->lock);
65+
/* Following variables are only useful for debugging when
66+
* when playback halts unexpectedly. Thus, no mutual exclusion
67+
* enforced
68+
*/
69+
n += scnprintf(buffer + n, debug_bufmax - n,
70+
"wflush %d\n", audio->wflush);
71+
n += scnprintf(buffer + n, debug_bufmax - n,
72+
"rflush %d\n", audio->rflush);
73+
n += scnprintf(buffer + n, debug_bufmax - n,
74+
"inqueue empty %d\n",
75+
list_empty(&audio->in_queue));
76+
n += scnprintf(buffer + n, debug_bufmax - n,
77+
"outqueue empty %d\n",
78+
list_empty(&audio->out_queue));
79+
}
80+
mutex_unlock(&lock);
7081
buffer[n] = 0;
7182
return simple_read_from_buffer(buf, count, ppos, buffer, n);
7283
}
@@ -574,6 +585,7 @@ int audio_aio_release(struct inode *inode, struct file *file)
574585
{
575586
struct q6audio_aio *audio = file->private_data;
576587
pr_debug("%s[%pK]\n", __func__, audio);
588+
mutex_lock(&lock);
577589
mutex_lock(&audio->lock);
578590
mutex_lock(&audio->read_lock);
579591
mutex_lock(&audio->write_lock);
@@ -617,6 +629,8 @@ int audio_aio_release(struct inode *inode, struct file *file)
617629
#endif
618630
kfree(audio->codec_cfg);
619631
kfree(audio);
632+
file->private_data = NULL;
633+
mutex_unlock(&lock);
620634
return 0;
621635
}
622636

0 commit comments

Comments
 (0)