1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0 2*4882a593Smuzhiyun #include <linux/kthread.h> 3*4882a593Smuzhiyun #include <linux/wait.h> 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include "spk_types.h" 6*4882a593Smuzhiyun #include "speakup.h" 7*4882a593Smuzhiyun #include "spk_priv.h" 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun DECLARE_WAIT_QUEUE_HEAD(speakup_event); 10*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(speakup_event); 11*4882a593Smuzhiyun speakup_thread(void * data)12*4882a593Smuzhiyunint speakup_thread(void *data) 13*4882a593Smuzhiyun { 14*4882a593Smuzhiyun unsigned long flags; 15*4882a593Smuzhiyun int should_break; 16*4882a593Smuzhiyun struct bleep our_sound; 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun our_sound.active = 0; 19*4882a593Smuzhiyun our_sound.freq = 0; 20*4882a593Smuzhiyun our_sound.jiffies = 0; 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun mutex_lock(&spk_mutex); 23*4882a593Smuzhiyun while (1) { 24*4882a593Smuzhiyun DEFINE_WAIT(wait); 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun while (1) { 27*4882a593Smuzhiyun spin_lock_irqsave(&speakup_info.spinlock, flags); 28*4882a593Smuzhiyun our_sound = spk_unprocessed_sound; 29*4882a593Smuzhiyun spk_unprocessed_sound.active = 0; 30*4882a593Smuzhiyun prepare_to_wait(&speakup_event, &wait, 31*4882a593Smuzhiyun TASK_INTERRUPTIBLE); 32*4882a593Smuzhiyun should_break = kthread_should_stop() || 33*4882a593Smuzhiyun our_sound.active || 34*4882a593Smuzhiyun (synth && synth->catch_up && synth->alive && 35*4882a593Smuzhiyun (speakup_info.flushing || 36*4882a593Smuzhiyun !synth_buffer_empty())); 37*4882a593Smuzhiyun spin_unlock_irqrestore(&speakup_info.spinlock, flags); 38*4882a593Smuzhiyun if (should_break) 39*4882a593Smuzhiyun break; 40*4882a593Smuzhiyun mutex_unlock(&spk_mutex); 41*4882a593Smuzhiyun schedule(); 42*4882a593Smuzhiyun mutex_lock(&spk_mutex); 43*4882a593Smuzhiyun } 44*4882a593Smuzhiyun finish_wait(&speakup_event, &wait); 45*4882a593Smuzhiyun if (kthread_should_stop()) 46*4882a593Smuzhiyun break; 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun if (our_sound.active) 49*4882a593Smuzhiyun kd_mksound(our_sound.freq, our_sound.jiffies); 50*4882a593Smuzhiyun if (synth && synth->catch_up && synth->alive) { 51*4882a593Smuzhiyun /* 52*4882a593Smuzhiyun * It is up to the callee to take the lock, so that it 53*4882a593Smuzhiyun * can sleep whenever it likes 54*4882a593Smuzhiyun */ 55*4882a593Smuzhiyun synth->catch_up(synth); 56*4882a593Smuzhiyun } 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun speakup_start_ttys(); 59*4882a593Smuzhiyun } 60*4882a593Smuzhiyun mutex_unlock(&spk_mutex); 61*4882a593Smuzhiyun return 0; 62*4882a593Smuzhiyun } 63