Lines Matching refs:tscm

18 static long tscm_hwdep_read_locked(struct snd_tscm *tscm, char __user *buf,  in tscm_hwdep_read_locked()  argument
20 __releases(&tscm->lock) in tscm_hwdep_read_locked()
26 event.status = (tscm->dev_lock_count > 0); in tscm_hwdep_read_locked()
27 tscm->dev_lock_changed = false; in tscm_hwdep_read_locked()
30 spin_unlock_irq(&tscm->lock); in tscm_hwdep_read_locked()
38 static long tscm_hwdep_read_queue(struct snd_tscm *tscm, char __user *buf, in tscm_hwdep_read_queue() argument
40 __releases(&tscm->lock) in tscm_hwdep_read_queue()
44 struct snd_firewire_tascam_change *entries = tscm->queue; in tscm_hwdep_read_queue()
49 spin_unlock_irq(&tscm->lock); in tscm_hwdep_read_queue()
63 if (tscm->pull_pos == tscm->push_pos) in tscm_hwdep_read_queue()
65 else if (tscm->pull_pos < tscm->push_pos) in tscm_hwdep_read_queue()
66 tail_pos = tscm->push_pos; in tscm_hwdep_read_queue()
69 head_pos = tscm->pull_pos; in tscm_hwdep_read_queue()
77 spin_unlock_irq(&tscm->lock); in tscm_hwdep_read_queue()
81 spin_lock_irq(&tscm->lock); in tscm_hwdep_read_queue()
83 tscm->pull_pos = tail_pos % SND_TSCM_QUEUE_COUNT; in tscm_hwdep_read_queue()
90 spin_unlock_irq(&tscm->lock); in tscm_hwdep_read_queue()
101 struct snd_tscm *tscm = hwdep->private_data; in hwdep_read() local
104 spin_lock_irq(&tscm->lock); in hwdep_read()
106 while (!tscm->dev_lock_changed && tscm->push_pos == tscm->pull_pos) { in hwdep_read()
107 prepare_to_wait(&tscm->hwdep_wait, &wait, TASK_INTERRUPTIBLE); in hwdep_read()
108 spin_unlock_irq(&tscm->lock); in hwdep_read()
110 finish_wait(&tscm->hwdep_wait, &wait); in hwdep_read()
113 spin_lock_irq(&tscm->lock); in hwdep_read()
117 if (tscm->dev_lock_changed) { in hwdep_read()
118 count = tscm_hwdep_read_locked(tscm, buf, count, offset); in hwdep_read()
119 } else if (tscm->push_pos != tscm->pull_pos) { in hwdep_read()
120 count = tscm_hwdep_read_queue(tscm, buf, count, offset); in hwdep_read()
122 spin_unlock_irq(&tscm->lock); in hwdep_read()
132 struct snd_tscm *tscm = hwdep->private_data; in hwdep_poll() local
135 poll_wait(file, &tscm->hwdep_wait, wait); in hwdep_poll()
137 spin_lock_irq(&tscm->lock); in hwdep_poll()
138 if (tscm->dev_lock_changed || tscm->push_pos != tscm->pull_pos) in hwdep_poll()
142 spin_unlock_irq(&tscm->lock); in hwdep_poll()
147 static int hwdep_get_info(struct snd_tscm *tscm, void __user *arg) in hwdep_get_info() argument
149 struct fw_device *dev = fw_parent_device(tscm->unit); in hwdep_get_info()
166 static int hwdep_lock(struct snd_tscm *tscm) in hwdep_lock() argument
170 spin_lock_irq(&tscm->lock); in hwdep_lock()
172 if (tscm->dev_lock_count == 0) { in hwdep_lock()
173 tscm->dev_lock_count = -1; in hwdep_lock()
179 spin_unlock_irq(&tscm->lock); in hwdep_lock()
184 static int hwdep_unlock(struct snd_tscm *tscm) in hwdep_unlock() argument
188 spin_lock_irq(&tscm->lock); in hwdep_unlock()
190 if (tscm->dev_lock_count == -1) { in hwdep_unlock()
191 tscm->dev_lock_count = 0; in hwdep_unlock()
197 spin_unlock_irq(&tscm->lock); in hwdep_unlock()
202 static int tscm_hwdep_state(struct snd_tscm *tscm, void __user *arg) in tscm_hwdep_state() argument
204 if (copy_to_user(arg, tscm->state, sizeof(tscm->state))) in tscm_hwdep_state()
212 struct snd_tscm *tscm = hwdep->private_data; in hwdep_release() local
214 spin_lock_irq(&tscm->lock); in hwdep_release()
215 if (tscm->dev_lock_count == -1) in hwdep_release()
216 tscm->dev_lock_count = 0; in hwdep_release()
217 spin_unlock_irq(&tscm->lock); in hwdep_release()
225 struct snd_tscm *tscm = hwdep->private_data; in hwdep_ioctl() local
229 return hwdep_get_info(tscm, (void __user *)arg); in hwdep_ioctl()
231 return hwdep_lock(tscm); in hwdep_ioctl()
233 return hwdep_unlock(tscm); in hwdep_ioctl()
235 return tscm_hwdep_state(tscm, (void __user *)arg); in hwdep_ioctl()
252 int snd_tscm_create_hwdep_device(struct snd_tscm *tscm) in snd_tscm_create_hwdep_device() argument
264 err = snd_hwdep_new(tscm->card, "Tascam", 0, &hwdep); in snd_tscm_create_hwdep_device()
271 hwdep->private_data = tscm; in snd_tscm_create_hwdep_device()
274 tscm->hwdep = hwdep; in snd_tscm_create_hwdep_device()