Loading sound/firewire/fireworks/fireworks.h +2 −2 Original line number Diff line number Diff line Loading @@ -86,8 +86,8 @@ struct snd_efw { struct amdtp_stream rx_stream; struct cmp_connection out_conn; struct cmp_connection in_conn; atomic_t capture_substreams; atomic_t playback_substreams; unsigned int capture_substreams; unsigned int playback_substreams; /* hardware metering parameters */ unsigned int phys_out; Loading sound/firewire/fireworks/fireworks_midi.c +12 −4 Original line number Diff line number Diff line Loading @@ -17,8 +17,10 @@ static int midi_capture_open(struct snd_rawmidi_substream *substream) if (err < 0) goto end; atomic_inc(&efw->capture_substreams); mutex_lock(&efw->mutex); efw->capture_substreams++; err = snd_efw_stream_start_duplex(efw, 0); mutex_unlock(&efw->mutex); if (err < 0) snd_efw_stream_lock_release(efw); Loading @@ -35,8 +37,10 @@ static int midi_playback_open(struct snd_rawmidi_substream *substream) if (err < 0) goto end; atomic_inc(&efw->playback_substreams); mutex_lock(&efw->mutex); efw->playback_substreams++; err = snd_efw_stream_start_duplex(efw, 0); mutex_unlock(&efw->mutex); if (err < 0) snd_efw_stream_lock_release(efw); end: Loading @@ -47,8 +51,10 @@ static int midi_capture_close(struct snd_rawmidi_substream *substream) { struct snd_efw *efw = substream->rmidi->private_data; atomic_dec(&efw->capture_substreams); mutex_lock(&efw->mutex); efw->capture_substreams--; snd_efw_stream_stop_duplex(efw); mutex_unlock(&efw->mutex); snd_efw_stream_lock_release(efw); return 0; Loading @@ -58,8 +64,10 @@ static int midi_playback_close(struct snd_rawmidi_substream *substream) { struct snd_efw *efw = substream->rmidi->private_data; atomic_dec(&efw->playback_substreams); mutex_lock(&efw->mutex); efw->playback_substreams--; snd_efw_stream_stop_duplex(efw); mutex_unlock(&efw->mutex); snd_efw_stream_lock_release(efw); return 0; Loading sound/firewire/fireworks/fireworks_pcm.c +20 −8 Original line number Diff line number Diff line Loading @@ -251,8 +251,11 @@ static int pcm_capture_hw_params(struct snd_pcm_substream *substream, if (err < 0) return err; if (substream->runtime->status->state == SNDRV_PCM_STATE_OPEN) atomic_inc(&efw->capture_substreams); if (substream->runtime->status->state == SNDRV_PCM_STATE_OPEN) { mutex_lock(&efw->mutex); efw->capture_substreams++; mutex_unlock(&efw->mutex); } amdtp_am824_set_pcm_format(&efw->tx_stream, params_format(hw_params)); Loading @@ -269,8 +272,11 @@ static int pcm_playback_hw_params(struct snd_pcm_substream *substream, if (err < 0) return err; if (substream->runtime->status->state == SNDRV_PCM_STATE_OPEN) atomic_inc(&efw->playback_substreams); if (substream->runtime->status->state == SNDRV_PCM_STATE_OPEN) { mutex_lock(&efw->mutex); efw->playback_substreams++; mutex_unlock(&efw->mutex); } amdtp_am824_set_pcm_format(&efw->rx_stream, params_format(hw_params)); Loading @@ -281,8 +287,11 @@ static int pcm_capture_hw_free(struct snd_pcm_substream *substream) { struct snd_efw *efw = substream->private_data; if (substream->runtime->status->state != SNDRV_PCM_STATE_OPEN) atomic_dec(&efw->capture_substreams); if (substream->runtime->status->state != SNDRV_PCM_STATE_OPEN) { mutex_lock(&efw->mutex); efw->capture_substreams--; mutex_unlock(&efw->mutex); } snd_efw_stream_stop_duplex(efw); Loading @@ -292,8 +301,11 @@ static int pcm_playback_hw_free(struct snd_pcm_substream *substream) { struct snd_efw *efw = substream->private_data; if (substream->runtime->status->state != SNDRV_PCM_STATE_OPEN) atomic_dec(&efw->playback_substreams); if (substream->runtime->status->state != SNDRV_PCM_STATE_OPEN) { mutex_lock(&efw->mutex); efw->playback_substreams--; mutex_unlock(&efw->mutex); } snd_efw_stream_stop_duplex(efw); Loading sound/firewire/fireworks/fireworks_stream.c +12 −20 Original line number Diff line number Diff line Loading @@ -209,16 +209,13 @@ int snd_efw_stream_init_duplex(struct snd_efw *efw) int snd_efw_stream_start_duplex(struct snd_efw *efw, unsigned int rate) { struct amdtp_stream *master, *slave; atomic_t *slave_substreams; unsigned int slave_substreams; enum cip_flags sync_mode; unsigned int curr_rate; int err = 0; mutex_lock(&efw->mutex); /* Need no substreams */ if ((atomic_read(&efw->playback_substreams) == 0) && (atomic_read(&efw->capture_substreams) == 0)) if (efw->playback_substreams == 0 && efw->capture_substreams == 0) goto end; err = get_sync_mode(efw, &sync_mode); Loading @@ -227,11 +224,11 @@ int snd_efw_stream_start_duplex(struct snd_efw *efw, unsigned int rate) if (sync_mode == CIP_SYNC_TO_DEVICE) { master = &efw->tx_stream; slave = &efw->rx_stream; slave_substreams = &efw->playback_substreams; slave_substreams = efw->playback_substreams; } else { master = &efw->rx_stream; slave = &efw->tx_stream; slave_substreams = &efw->capture_substreams; slave_substreams = efw->capture_substreams; } /* Loading Loading @@ -277,7 +274,7 @@ int snd_efw_stream_start_duplex(struct snd_efw *efw, unsigned int rate) } /* start slave if needed */ if (atomic_read(slave_substreams) > 0 && !amdtp_stream_running(slave)) { if (slave_substreams > 0 && !amdtp_stream_running(slave)) { err = start_stream(efw, slave, rate); if (err < 0) { dev_err(&efw->unit->device, Loading @@ -286,37 +283,32 @@ int snd_efw_stream_start_duplex(struct snd_efw *efw, unsigned int rate) } } end: mutex_unlock(&efw->mutex); return err; } void snd_efw_stream_stop_duplex(struct snd_efw *efw) { struct amdtp_stream *master, *slave; atomic_t *master_substreams, *slave_substreams; unsigned int master_substreams, slave_substreams; if (efw->master == &efw->rx_stream) { slave = &efw->tx_stream; master = &efw->rx_stream; slave_substreams = &efw->capture_substreams; master_substreams = &efw->playback_substreams; slave_substreams = efw->capture_substreams; master_substreams = efw->playback_substreams; } else { slave = &efw->rx_stream; master = &efw->tx_stream; slave_substreams = &efw->playback_substreams; master_substreams = &efw->capture_substreams; slave_substreams = efw->playback_substreams; master_substreams = efw->capture_substreams; } mutex_lock(&efw->mutex); if (atomic_read(slave_substreams) == 0) { if (slave_substreams == 0) { stop_stream(efw, slave); if (atomic_read(master_substreams) == 0) if (master_substreams == 0) stop_stream(efw, master); } mutex_unlock(&efw->mutex); } void snd_efw_stream_update_duplex(struct snd_efw *efw) Loading Loading
sound/firewire/fireworks/fireworks.h +2 −2 Original line number Diff line number Diff line Loading @@ -86,8 +86,8 @@ struct snd_efw { struct amdtp_stream rx_stream; struct cmp_connection out_conn; struct cmp_connection in_conn; atomic_t capture_substreams; atomic_t playback_substreams; unsigned int capture_substreams; unsigned int playback_substreams; /* hardware metering parameters */ unsigned int phys_out; Loading
sound/firewire/fireworks/fireworks_midi.c +12 −4 Original line number Diff line number Diff line Loading @@ -17,8 +17,10 @@ static int midi_capture_open(struct snd_rawmidi_substream *substream) if (err < 0) goto end; atomic_inc(&efw->capture_substreams); mutex_lock(&efw->mutex); efw->capture_substreams++; err = snd_efw_stream_start_duplex(efw, 0); mutex_unlock(&efw->mutex); if (err < 0) snd_efw_stream_lock_release(efw); Loading @@ -35,8 +37,10 @@ static int midi_playback_open(struct snd_rawmidi_substream *substream) if (err < 0) goto end; atomic_inc(&efw->playback_substreams); mutex_lock(&efw->mutex); efw->playback_substreams++; err = snd_efw_stream_start_duplex(efw, 0); mutex_unlock(&efw->mutex); if (err < 0) snd_efw_stream_lock_release(efw); end: Loading @@ -47,8 +51,10 @@ static int midi_capture_close(struct snd_rawmidi_substream *substream) { struct snd_efw *efw = substream->rmidi->private_data; atomic_dec(&efw->capture_substreams); mutex_lock(&efw->mutex); efw->capture_substreams--; snd_efw_stream_stop_duplex(efw); mutex_unlock(&efw->mutex); snd_efw_stream_lock_release(efw); return 0; Loading @@ -58,8 +64,10 @@ static int midi_playback_close(struct snd_rawmidi_substream *substream) { struct snd_efw *efw = substream->rmidi->private_data; atomic_dec(&efw->playback_substreams); mutex_lock(&efw->mutex); efw->playback_substreams--; snd_efw_stream_stop_duplex(efw); mutex_unlock(&efw->mutex); snd_efw_stream_lock_release(efw); return 0; Loading
sound/firewire/fireworks/fireworks_pcm.c +20 −8 Original line number Diff line number Diff line Loading @@ -251,8 +251,11 @@ static int pcm_capture_hw_params(struct snd_pcm_substream *substream, if (err < 0) return err; if (substream->runtime->status->state == SNDRV_PCM_STATE_OPEN) atomic_inc(&efw->capture_substreams); if (substream->runtime->status->state == SNDRV_PCM_STATE_OPEN) { mutex_lock(&efw->mutex); efw->capture_substreams++; mutex_unlock(&efw->mutex); } amdtp_am824_set_pcm_format(&efw->tx_stream, params_format(hw_params)); Loading @@ -269,8 +272,11 @@ static int pcm_playback_hw_params(struct snd_pcm_substream *substream, if (err < 0) return err; if (substream->runtime->status->state == SNDRV_PCM_STATE_OPEN) atomic_inc(&efw->playback_substreams); if (substream->runtime->status->state == SNDRV_PCM_STATE_OPEN) { mutex_lock(&efw->mutex); efw->playback_substreams++; mutex_unlock(&efw->mutex); } amdtp_am824_set_pcm_format(&efw->rx_stream, params_format(hw_params)); Loading @@ -281,8 +287,11 @@ static int pcm_capture_hw_free(struct snd_pcm_substream *substream) { struct snd_efw *efw = substream->private_data; if (substream->runtime->status->state != SNDRV_PCM_STATE_OPEN) atomic_dec(&efw->capture_substreams); if (substream->runtime->status->state != SNDRV_PCM_STATE_OPEN) { mutex_lock(&efw->mutex); efw->capture_substreams--; mutex_unlock(&efw->mutex); } snd_efw_stream_stop_duplex(efw); Loading @@ -292,8 +301,11 @@ static int pcm_playback_hw_free(struct snd_pcm_substream *substream) { struct snd_efw *efw = substream->private_data; if (substream->runtime->status->state != SNDRV_PCM_STATE_OPEN) atomic_dec(&efw->playback_substreams); if (substream->runtime->status->state != SNDRV_PCM_STATE_OPEN) { mutex_lock(&efw->mutex); efw->playback_substreams--; mutex_unlock(&efw->mutex); } snd_efw_stream_stop_duplex(efw); Loading
sound/firewire/fireworks/fireworks_stream.c +12 −20 Original line number Diff line number Diff line Loading @@ -209,16 +209,13 @@ int snd_efw_stream_init_duplex(struct snd_efw *efw) int snd_efw_stream_start_duplex(struct snd_efw *efw, unsigned int rate) { struct amdtp_stream *master, *slave; atomic_t *slave_substreams; unsigned int slave_substreams; enum cip_flags sync_mode; unsigned int curr_rate; int err = 0; mutex_lock(&efw->mutex); /* Need no substreams */ if ((atomic_read(&efw->playback_substreams) == 0) && (atomic_read(&efw->capture_substreams) == 0)) if (efw->playback_substreams == 0 && efw->capture_substreams == 0) goto end; err = get_sync_mode(efw, &sync_mode); Loading @@ -227,11 +224,11 @@ int snd_efw_stream_start_duplex(struct snd_efw *efw, unsigned int rate) if (sync_mode == CIP_SYNC_TO_DEVICE) { master = &efw->tx_stream; slave = &efw->rx_stream; slave_substreams = &efw->playback_substreams; slave_substreams = efw->playback_substreams; } else { master = &efw->rx_stream; slave = &efw->tx_stream; slave_substreams = &efw->capture_substreams; slave_substreams = efw->capture_substreams; } /* Loading Loading @@ -277,7 +274,7 @@ int snd_efw_stream_start_duplex(struct snd_efw *efw, unsigned int rate) } /* start slave if needed */ if (atomic_read(slave_substreams) > 0 && !amdtp_stream_running(slave)) { if (slave_substreams > 0 && !amdtp_stream_running(slave)) { err = start_stream(efw, slave, rate); if (err < 0) { dev_err(&efw->unit->device, Loading @@ -286,37 +283,32 @@ int snd_efw_stream_start_duplex(struct snd_efw *efw, unsigned int rate) } } end: mutex_unlock(&efw->mutex); return err; } void snd_efw_stream_stop_duplex(struct snd_efw *efw) { struct amdtp_stream *master, *slave; atomic_t *master_substreams, *slave_substreams; unsigned int master_substreams, slave_substreams; if (efw->master == &efw->rx_stream) { slave = &efw->tx_stream; master = &efw->rx_stream; slave_substreams = &efw->capture_substreams; master_substreams = &efw->playback_substreams; slave_substreams = efw->capture_substreams; master_substreams = efw->playback_substreams; } else { slave = &efw->rx_stream; master = &efw->tx_stream; slave_substreams = &efw->playback_substreams; master_substreams = &efw->capture_substreams; slave_substreams = efw->playback_substreams; master_substreams = efw->capture_substreams; } mutex_lock(&efw->mutex); if (atomic_read(slave_substreams) == 0) { if (slave_substreams == 0) { stop_stream(efw, slave); if (atomic_read(master_substreams) == 0) if (master_substreams == 0) stop_stream(efw, master); } mutex_unlock(&efw->mutex); } void snd_efw_stream_update_duplex(struct snd_efw *efw) Loading