summaryrefslogtreecommitdiffstats
path: root/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
diff options
context:
space:
mode:
authorNicolas Saenz Julienne <nsaenzjulienne@suse.de>2020-06-29 17:09:11 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2020-07-01 15:47:04 +0200
commitb74a8932dff818f5ff83101c8088a307a8f2eeda (patch)
tree32f04bf84caeb3b02ea701af41fb976bbbd95095 /drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
parent5a8e22e3d319ddae77c9fcce31ebc40577a32c6a (diff)
downloadlinux-stable-b74a8932dff818f5ff83101c8088a307a8f2eeda.tar.gz
linux-stable-b74a8932dff818f5ff83101c8088a307a8f2eeda.tar.bz2
linux-stable-b74a8932dff818f5ff83101c8088a307a8f2eeda.zip
staging: vc04_services: bcm2835-audio: Use vchi_msg_hold()
vchi_msg_dequeue() provides the same functionality as vchi_msg_hold() except it copies the message data as opposed to the later which provides the data in place. The copying is done on a local variable, so there is no need to keep the message out the function's bounds, so use vchi_msg_hold() instead. Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de> Link: https://lore.kernel.org/r/20200629150945.10720-14-nsaenzjulienne@suse.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c')
-rw-r--r--drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c25
1 files changed, 14 insertions, 11 deletions
diff --git a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
index 62eef233275f..5018b5baa009 100644
--- a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
+++ b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
@@ -94,31 +94,34 @@ static void audio_vchi_callback(void *param,
void *msg_handle)
{
struct bcm2835_audio_instance *instance = param;
- struct vc_audio_msg m;
- int msg_len;
+ struct vchi_held_msg handle;
+ struct vc_audio_msg *m;
+ unsigned size;
int status;
if (reason != VCHI_CALLBACK_MSG_AVAILABLE)
return;
- status = vchi_msg_dequeue(instance->service,
- &m, sizeof(m), &msg_len, VCHI_FLAGS_NONE);
+ status = vchi_msg_hold(instance->service, (void **)&m, &size,
+ VCHI_FLAGS_NONE, &handle);
if (status)
return;
- if (m.type == VC_AUDIO_MSG_TYPE_RESULT) {
- instance->result = m.result.success;
+ if (m->type == VC_AUDIO_MSG_TYPE_RESULT) {
+ instance->result = m->result.success;
complete(&instance->msg_avail_comp);
- } else if (m.type == VC_AUDIO_MSG_TYPE_COMPLETE) {
- if (m.complete.cookie1 != VC_AUDIO_WRITE_COOKIE1 ||
- m.complete.cookie2 != VC_AUDIO_WRITE_COOKIE2)
+ } else if (m->type == VC_AUDIO_MSG_TYPE_COMPLETE) {
+ if (m->complete.cookie1 != VC_AUDIO_WRITE_COOKIE1 ||
+ m->complete.cookie2 != VC_AUDIO_WRITE_COOKIE2)
dev_err(instance->dev, "invalid cookie\n");
else
bcm2835_playback_fifo(instance->alsa_stream,
- m.complete.count);
+ m->complete.count);
} else {
- dev_err(instance->dev, "unexpected callback type=%d\n", m.type);
+ dev_err(instance->dev, "unexpected callback type=%d\n", m->type);
}
+
+ vchi_held_msg_release(&handle);
}
static int