aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/cx18/cx18-mailbox.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/cx18/cx18-mailbox.c')
-rw-r--r--drivers/media/video/cx18/cx18-mailbox.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/drivers/media/video/cx18/cx18-mailbox.c b/drivers/media/video/cx18/cx18-mailbox.c
index ed8118390b02..eabf00c6351b 100644
--- a/drivers/media/video/cx18/cx18-mailbox.c
+++ b/drivers/media/video/cx18/cx18-mailbox.c
@@ -434,6 +434,7 @@ static int epu_dma_done_irq(struct cx18 *cx, struct cx18_in_work_order *order)
434{ 434{
435 u32 handle, mdl_ack_offset, mdl_ack_count; 435 u32 handle, mdl_ack_offset, mdl_ack_count;
436 struct cx18_mailbox *mb; 436 struct cx18_mailbox *mb;
437 int i;
437 438
438 mb = &order->mb; 439 mb = &order->mb;
439 handle = mb->args[0]; 440 handle = mb->args[0];
@@ -447,8 +448,9 @@ static int epu_dma_done_irq(struct cx18 *cx, struct cx18_in_work_order *order)
447 return -1; 448 return -1;
448 } 449 }
449 450
450 cx18_memcpy_fromio(cx, order->mdl_ack, cx->enc_mem + mdl_ack_offset, 451 for (i = 0; i < sizeof(struct cx18_mdl_ack) * mdl_ack_count; i += sizeof(u32))
451 sizeof(struct cx18_mdl_ack) * mdl_ack_count); 452 ((u32 *)order->mdl_ack)[i / sizeof(u32)] =
453 cx18_readl(cx, cx->enc_mem + mdl_ack_offset + i);
452 454
453 if ((order->flags & CX18_F_EWO_MB_STALE) == 0) 455 if ((order->flags & CX18_F_EWO_MB_STALE) == 0)
454 mb_ack_irq(cx, order); 456 mb_ack_irq(cx, order);
@@ -538,6 +540,7 @@ void cx18_api_epu_cmd_irq(struct cx18 *cx, int rpu)
538 struct cx18_mailbox *order_mb; 540 struct cx18_mailbox *order_mb;
539 struct cx18_in_work_order *order; 541 struct cx18_in_work_order *order;
540 int submit; 542 int submit;
543 int i;
541 544
542 switch (rpu) { 545 switch (rpu) {
543 case CPU: 546 case CPU:
@@ -562,10 +565,12 @@ void cx18_api_epu_cmd_irq(struct cx18 *cx, int rpu)
562 order_mb = &order->mb; 565 order_mb = &order->mb;
563 566
564 /* mb->cmd and mb->args[0] through mb->args[2] */ 567 /* mb->cmd and mb->args[0] through mb->args[2] */
565 cx18_memcpy_fromio(cx, &order_mb->cmd, &mb->cmd, 4 * sizeof(u32)); 568 for (i = 0; i < 4; i++)
569 (&order_mb->cmd)[i] = cx18_readl(cx, &mb->cmd + i);
570
566 /* mb->request and mb->ack. N.B. we want to read mb->ack last */ 571 /* mb->request and mb->ack. N.B. we want to read mb->ack last */
567 cx18_memcpy_fromio(cx, &order_mb->request, &mb->request, 572 for (i = 0; i < 2; i++)
568 2 * sizeof(u32)); 573 (&order_mb->request)[i] = cx18_readl(cx, &mb->request + i);
569 574
570 if (order_mb->request == order_mb->ack) { 575 if (order_mb->request == order_mb->ack) {
571 CX18_DEBUG_WARN("Possibly falling behind: %s self-ack'ed our " 576 CX18_DEBUG_WARN("Possibly falling behind: %s self-ack'ed our "