mirror of https://gitee.com/openkylin/linux.git
usb: gadget: u_audio: clean up locking
snd_pcm_stream_lock() is held when the ALSA .trigger() callback is called. The lock of 'struct uac_rtd_params' is not necessary since all its locking operation are done under the snd_pcm_stream_lock() too. Also, usb_request .complete() is called with irqs disabled, so saving and restoring the irqs is not necessary. Acked-by: Felipe Balbi <balbi@kernel.org> Signed-off-by: Jerome Brunet <jbrunet@baylibre.com> Link: https://lore.kernel.org/r/20210118084931.322861-1-jbrunet@baylibre.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
2986511780
commit
d70f7598c4
|
@ -36,9 +36,8 @@ struct uac_rtd_params {
|
|||
void *rbuf;
|
||||
|
||||
unsigned int max_psize; /* MaxPacketSize of endpoint */
|
||||
struct usb_request **reqs;
|
||||
|
||||
spinlock_t lock;
|
||||
struct usb_request **reqs;
|
||||
};
|
||||
|
||||
struct snd_uac_chip {
|
||||
|
@ -74,7 +73,6 @@ static const struct snd_pcm_hardware uac_pcm_hardware = {
|
|||
static void u_audio_iso_complete(struct usb_ep *ep, struct usb_request *req)
|
||||
{
|
||||
unsigned int pending;
|
||||
unsigned long flags, flags2;
|
||||
unsigned int hw_ptr;
|
||||
int status = req->status;
|
||||
struct snd_pcm_substream *substream;
|
||||
|
@ -105,16 +103,14 @@ static void u_audio_iso_complete(struct usb_ep *ep, struct usb_request *req)
|
|||
if (!substream)
|
||||
goto exit;
|
||||
|
||||
snd_pcm_stream_lock_irqsave(substream, flags2);
|
||||
snd_pcm_stream_lock(substream);
|
||||
|
||||
runtime = substream->runtime;
|
||||
if (!runtime || !snd_pcm_running(substream)) {
|
||||
snd_pcm_stream_unlock_irqrestore(substream, flags2);
|
||||
snd_pcm_stream_unlock(substream);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&prm->lock, flags);
|
||||
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
||||
/*
|
||||
* For each IN packet, take the quotient of the current data
|
||||
|
@ -141,8 +137,6 @@ static void u_audio_iso_complete(struct usb_ep *ep, struct usb_request *req)
|
|||
|
||||
hw_ptr = prm->hw_ptr;
|
||||
|
||||
spin_unlock_irqrestore(&prm->lock, flags);
|
||||
|
||||
/* Pack USB load in ALSA ring buffer */
|
||||
pending = runtime->dma_bytes - hw_ptr;
|
||||
|
||||
|
@ -166,12 +160,10 @@ static void u_audio_iso_complete(struct usb_ep *ep, struct usb_request *req)
|
|||
}
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&prm->lock, flags);
|
||||
/* update hw_ptr after data is copied to memory */
|
||||
prm->hw_ptr = (hw_ptr + req->actual) % runtime->dma_bytes;
|
||||
hw_ptr = prm->hw_ptr;
|
||||
spin_unlock_irqrestore(&prm->lock, flags);
|
||||
snd_pcm_stream_unlock_irqrestore(substream, flags2);
|
||||
snd_pcm_stream_unlock(substream);
|
||||
|
||||
if ((hw_ptr % snd_pcm_lib_period_bytes(substream)) < req->actual)
|
||||
snd_pcm_period_elapsed(substream);
|
||||
|
@ -187,7 +179,6 @@ static int uac_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
|
|||
struct uac_rtd_params *prm;
|
||||
struct g_audio *audio_dev;
|
||||
struct uac_params *params;
|
||||
unsigned long flags;
|
||||
int err = 0;
|
||||
|
||||
audio_dev = uac->audio_dev;
|
||||
|
@ -198,8 +189,6 @@ static int uac_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
|
|||
else
|
||||
prm = &uac->c_prm;
|
||||
|
||||
spin_lock_irqsave(&prm->lock, flags);
|
||||
|
||||
/* Reset */
|
||||
prm->hw_ptr = 0;
|
||||
|
||||
|
@ -216,8 +205,6 @@ static int uac_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
|
|||
err = -EINVAL;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&prm->lock, flags);
|
||||
|
||||
/* Clear buffer after Play stops */
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK && !prm->ss)
|
||||
memset(prm->rbuf, 0, prm->max_psize * params->req_number);
|
||||
|
@ -280,14 +267,12 @@ static int uac_pcm_open(struct snd_pcm_substream *substream)
|
|||
runtime->hw = uac_pcm_hardware;
|
||||
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
||||
spin_lock_init(&uac->p_prm.lock);
|
||||
runtime->hw.rate_min = p_srate;
|
||||
runtime->hw.formats = uac_ssize_to_fmt(p_ssize);
|
||||
runtime->hw.channels_min = num_channels(p_chmask);
|
||||
runtime->hw.period_bytes_min = 2 * uac->p_prm.max_psize
|
||||
/ runtime->hw.periods_min;
|
||||
} else {
|
||||
spin_lock_init(&uac->c_prm.lock);
|
||||
runtime->hw.rate_min = c_srate;
|
||||
runtime->hw.formats = uac_ssize_to_fmt(c_ssize);
|
||||
runtime->hw.channels_min = num_channels(c_chmask);
|
||||
|
|
Loading…
Reference in New Issue