summaryrefslogtreecommitdiffstats
path: root/drivers/staging/media/allegro-dvt/allegro-core.c
diff options
context:
space:
mode:
authorMichael Tretter <m.tretter@pengutronix.de>2020-07-13 16:42:20 +0200
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>2020-07-19 14:00:31 +0200
commit3de16839669f60b6049734e3a9f553a2a958c4b5 (patch)
tree08e23e0e798acc0fb0fdf04849c8eef46ea49f5b /drivers/staging/media/allegro-dvt/allegro-core.c
parente561f8e24c5ade18f97970c3034ac0f965370c3f (diff)
downloadlinux-3de16839669f60b6049734e3a9f553a2a958c4b5.tar.bz2
media: allegro: add explicit mail encoding and decoding
The message format in the mailboxes differ between firmware versions. Therefore, it is necessary to decouple the mailbox format of the driver from the message format of the firmware. This allows to keep a consistent message format in the driver while still supporting various firmware versions. Add an intermediate step to encode and decode message before writing the mails to the mailboxes. On the other hand, this allows to handle optional fields in the messages, which is required for advanced features of the encoder and was not possible until now. Signed-off-by: Michael Tretter <m.tretter@pengutronix.de> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Diffstat (limited to 'drivers/staging/media/allegro-dvt/allegro-core.c')
-rw-r--r--drivers/staging/media/allegro-dvt/allegro-core.c28
1 files changed, 24 insertions, 4 deletions
diff --git a/drivers/staging/media/allegro-dvt/allegro-core.c b/drivers/staging/media/allegro-dvt/allegro-core.c
index dc2627df0eec..6334b351ee3b 100644
--- a/drivers/staging/media/allegro-dvt/allegro-core.c
+++ b/drivers/staging/media/allegro-dvt/allegro-core.c
@@ -705,11 +705,20 @@ static ssize_t allegro_mbox_read(struct allegro_mbox *mbox,
static int allegro_mbox_send(struct allegro_mbox *mbox, void *msg)
{
struct allegro_dev *dev = mbox->dev;
- struct mcu_msg_header *header = msg;
- ssize_t size = sizeof(*header) + header->length;
+ ssize_t size;
int err;
+ u32 *tmp;
+
+ tmp = kzalloc(mbox->size, GFP_KERNEL);
+ if (!tmp) {
+ err = -ENOMEM;
+ goto out;
+ }
+
+ size = allegro_encode_mail(tmp, msg);
- err = allegro_mbox_write(mbox, msg, size);
+ err = allegro_mbox_write(mbox, tmp, size);
+ kfree(tmp);
if (err)
goto out;
@@ -728,18 +737,29 @@ static void allegro_mbox_notify(struct allegro_mbox *mbox)
struct allegro_dev *dev = mbox->dev;
union mcu_msg_response *msg;
ssize_t size;
+ u32 *tmp;
+ int err;
msg = kmalloc(sizeof(*msg), GFP_KERNEL);
if (!msg)
return;
- size = allegro_mbox_read(mbox, (u32 *)msg, sizeof(*msg));
+ tmp = kmalloc(mbox->size, GFP_KERNEL);
+ if (!tmp)
+ goto out;
+
+ size = allegro_mbox_read(mbox, tmp, mbox->size);
if (size < 0)
goto out;
+ err = allegro_decode_mail(msg, tmp);
+ if (err)
+ goto out;
+
allegro_handle_message(dev, msg);
out:
+ kfree(tmp);
kfree(msg);
}