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+
3538int 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