| From foo@baz Sun Aug 26 09:13:00 CEST 2018 |
| From: Vladimir Zapolskiy <vladimir_zapolskiy@mentor.com> |
| Date: Thu, 21 Jun 2018 17:22:49 +0200 |
| Subject: usb: gadget: u_audio: remove caching of stream buffer parameters |
| |
| From: Vladimir Zapolskiy <vladimir_zapolskiy@mentor.com> |
| |
| [ Upstream commit 96afb54ece0ee903d23a7ac04ddc461413b972c4 ] |
| |
| There is no necessity to copy PCM stream ring buffer area and size |
| properties to UAC private data structure, these values can be got |
| from substream itself. |
| |
| The change gives more control on substream and avoid stale caching. |
| |
| Fixes: 132fcb460839 ("usb: gadget: Add Audio Class 2.0 Driver") |
| Signed-off-by: Vladimir Zapolskiy <vladimir_zapolskiy@mentor.com> |
| Signed-off-by: Eugeniu Rosca <erosca@de.adit-jv.com> |
| Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/usb/gadget/function/u_audio.c | 30 +++++++++++++----------------- |
| 1 file changed, 13 insertions(+), 17 deletions(-) |
| |
| --- a/drivers/usb/gadget/function/u_audio.c |
| +++ b/drivers/usb/gadget/function/u_audio.c |
| @@ -41,9 +41,6 @@ struct uac_req { |
| struct uac_rtd_params { |
| struct snd_uac_chip *uac; /* parent chip */ |
| bool ep_enabled; /* if the ep is enabled */ |
| - /* Size of the ring buffer */ |
| - size_t dma_bytes; |
| - unsigned char *dma_area; |
| |
| struct snd_pcm_substream *ss; |
| |
| @@ -99,6 +96,7 @@ static void u_audio_iso_complete(struct |
| int status = req->status; |
| struct uac_req *ur = req->context; |
| struct snd_pcm_substream *substream; |
| + struct snd_pcm_runtime *runtime; |
| struct uac_rtd_params *prm = ur->pp; |
| struct snd_uac_chip *uac = prm->uac; |
| |
| @@ -120,6 +118,7 @@ static void u_audio_iso_complete(struct |
| if (!substream) |
| goto exit; |
| |
| + runtime = substream->runtime; |
| spin_lock_irqsave(&prm->lock, flags); |
| |
| if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { |
| @@ -156,29 +155,31 @@ static void u_audio_iso_complete(struct |
| spin_unlock_irqrestore(&prm->lock, flags); |
| |
| /* Pack USB load in ALSA ring buffer */ |
| - pending = prm->dma_bytes - hw_ptr; |
| + pending = runtime->dma_bytes - hw_ptr; |
| |
| if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { |
| if (unlikely(pending < req->actual)) { |
| - memcpy(req->buf, prm->dma_area + hw_ptr, pending); |
| - memcpy(req->buf + pending, prm->dma_area, |
| + memcpy(req->buf, runtime->dma_area + hw_ptr, pending); |
| + memcpy(req->buf + pending, runtime->dma_area, |
| req->actual - pending); |
| } else { |
| - memcpy(req->buf, prm->dma_area + hw_ptr, req->actual); |
| + memcpy(req->buf, runtime->dma_area + hw_ptr, |
| + req->actual); |
| } |
| } else { |
| if (unlikely(pending < req->actual)) { |
| - memcpy(prm->dma_area + hw_ptr, req->buf, pending); |
| - memcpy(prm->dma_area, req->buf + pending, |
| + memcpy(runtime->dma_area + hw_ptr, req->buf, pending); |
| + memcpy(runtime->dma_area, req->buf + pending, |
| req->actual - pending); |
| } else { |
| - memcpy(prm->dma_area + hw_ptr, req->buf, req->actual); |
| + memcpy(runtime->dma_area + hw_ptr, req->buf, |
| + req->actual); |
| } |
| } |
| |
| spin_lock_irqsave(&prm->lock, flags); |
| /* update hw_ptr after data is copied to memory */ |
| - prm->hw_ptr = (hw_ptr + req->actual) % prm->dma_bytes; |
| + prm->hw_ptr = (hw_ptr + req->actual) % runtime->dma_bytes; |
| spin_unlock_irqrestore(&prm->lock, flags); |
| |
| exit: |
| @@ -260,11 +261,8 @@ static int uac_pcm_hw_params(struct snd_ |
| |
| err = snd_pcm_lib_malloc_pages(substream, |
| params_buffer_bytes(hw_params)); |
| - if (err >= 0) { |
| - prm->dma_bytes = substream->runtime->dma_bytes; |
| - prm->dma_area = substream->runtime->dma_area; |
| + if (err >= 0) |
| prm->period_size = params_period_bytes(hw_params); |
| - } |
| |
| return err; |
| } |
| @@ -279,8 +277,6 @@ static int uac_pcm_hw_free(struct snd_pc |
| else |
| prm = &uac->c_prm; |
| |
| - prm->dma_area = NULL; |
| - prm->dma_bytes = 0; |
| prm->period_size = 0; |
| |
| return snd_pcm_lib_free_pages(substream); |