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