diff options
author | Hans Verkuil <hans.verkuil@cisco.com> | 2012-05-26 07:07:03 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-06-11 17:13:57 -0400 |
commit | 42d0c3ad28837a4a475c18b69160053fdb562976 (patch) | |
tree | 3d0a7c59c36ca9c9772b2ee18d6260d923696bc1 /drivers/media/video/cx18 | |
parent | 1c36dfc5c51b1406c2454fde922491ca6dab8513 (diff) |
[media] cx18: support big-endian systems
base_addr has type resource_size_t, which may be 64 bits.
Also fix a few endian issues related to mailboxes and firmware loading.
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/cx18')
-rw-r--r-- | drivers/media/video/cx18/cx18-driver.c | 10 | ||||
-rw-r--r-- | drivers/media/video/cx18/cx18-driver.h | 2 | ||||
-rw-r--r-- | drivers/media/video/cx18/cx18-firmware.c | 9 | ||||
-rw-r--r-- | drivers/media/video/cx18/cx18-mailbox.c | 15 |
4 files changed, 23 insertions, 13 deletions
diff --git a/drivers/media/video/cx18/cx18-driver.c b/drivers/media/video/cx18/cx18-driver.c index b55d57cc1a1c..7e5ffd6f5178 100644 --- a/drivers/media/video/cx18/cx18-driver.c +++ b/drivers/media/video/cx18/cx18-driver.c | |||
@@ -838,10 +838,10 @@ static int cx18_setup_pci(struct cx18 *cx, struct pci_dev *pci_dev, | |||
838 | } | 838 | } |
839 | 839 | ||
840 | CX18_DEBUG_INFO("cx%d (rev %d) at %02x:%02x.%x, " | 840 | CX18_DEBUG_INFO("cx%d (rev %d) at %02x:%02x.%x, " |
841 | "irq: %d, latency: %d, memory: 0x%lx\n", | 841 | "irq: %d, latency: %d, memory: 0x%llx\n", |
842 | cx->pci_dev->device, cx->card_rev, pci_dev->bus->number, | 842 | cx->pci_dev->device, cx->card_rev, pci_dev->bus->number, |
843 | PCI_SLOT(pci_dev->devfn), PCI_FUNC(pci_dev->devfn), | 843 | PCI_SLOT(pci_dev->devfn), PCI_FUNC(pci_dev->devfn), |
844 | cx->pci_dev->irq, pci_latency, (unsigned long)cx->base_addr); | 844 | cx->pci_dev->irq, pci_latency, (u64)cx->base_addr); |
845 | 845 | ||
846 | return 0; | 846 | return 0; |
847 | } | 847 | } |
@@ -938,7 +938,7 @@ static int __devinit cx18_probe(struct pci_dev *pci_dev, | |||
938 | if (retval) | 938 | if (retval) |
939 | goto err; | 939 | goto err; |
940 | 940 | ||
941 | CX18_DEBUG_INFO("base addr: 0x%08x\n", cx->base_addr); | 941 | CX18_DEBUG_INFO("base addr: 0x%llx\n", (u64)cx->base_addr); |
942 | 942 | ||
943 | /* PCI Device Setup */ | 943 | /* PCI Device Setup */ |
944 | retval = cx18_setup_pci(cx, pci_dev, pci_id); | 944 | retval = cx18_setup_pci(cx, pci_dev, pci_id); |
@@ -946,8 +946,8 @@ static int __devinit cx18_probe(struct pci_dev *pci_dev, | |||
946 | goto free_workqueues; | 946 | goto free_workqueues; |
947 | 947 | ||
948 | /* map io memory */ | 948 | /* map io memory */ |
949 | CX18_DEBUG_INFO("attempting ioremap at 0x%08x len 0x%08x\n", | 949 | CX18_DEBUG_INFO("attempting ioremap at 0x%llx len 0x%08x\n", |
950 | cx->base_addr + CX18_MEM_OFFSET, CX18_MEM_SIZE); | 950 | (u64)cx->base_addr + CX18_MEM_OFFSET, CX18_MEM_SIZE); |
951 | cx->enc_mem = ioremap_nocache(cx->base_addr + CX18_MEM_OFFSET, | 951 | cx->enc_mem = ioremap_nocache(cx->base_addr + CX18_MEM_OFFSET, |
952 | CX18_MEM_SIZE); | 952 | CX18_MEM_SIZE); |
953 | if (!cx->enc_mem) { | 953 | if (!cx->enc_mem) { |
diff --git a/drivers/media/video/cx18/cx18-driver.h b/drivers/media/video/cx18/cx18-driver.h index 7a37e0ee136f..2767c64df0c8 100644 --- a/drivers/media/video/cx18/cx18-driver.h +++ b/drivers/media/video/cx18/cx18-driver.h | |||
@@ -622,7 +622,7 @@ struct cx18 { | |||
622 | unique ID. Starts at 1, so 0 can be used as | 622 | unique ID. Starts at 1, so 0 can be used as |
623 | uninitialized value in the stream->id. */ | 623 | uninitialized value in the stream->id. */ |
624 | 624 | ||
625 | u32 base_addr; | 625 | resource_size_t base_addr; |
626 | 626 | ||
627 | u8 card_rev; | 627 | u8 card_rev; |
628 | void __iomem *enc_mem, *reg_mem; | 628 | void __iomem *enc_mem, *reg_mem; |
diff --git a/drivers/media/video/cx18/cx18-firmware.c b/drivers/media/video/cx18/cx18-firmware.c index 1b3fb502e6be..b85c292a849a 100644 --- a/drivers/media/video/cx18/cx18-firmware.c +++ b/drivers/media/video/cx18/cx18-firmware.c | |||
@@ -164,8 +164,13 @@ static int load_apu_fw_direct(const char *fn, u8 __iomem *dst, struct cx18 *cx, | |||
164 | 164 | ||
165 | apu_version = (vers[0] << 24) | (vers[4] << 16) | vers[32]; | 165 | apu_version = (vers[0] << 24) | (vers[4] << 16) | vers[32]; |
166 | while (offset + sizeof(seghdr) < fw->size) { | 166 | while (offset + sizeof(seghdr) < fw->size) { |
167 | /* TODO: byteswapping */ | 167 | const u32 *shptr = src + offset / 4; |
168 | memcpy(&seghdr, src + offset / 4, sizeof(seghdr)); | 168 | |
169 | seghdr.sync1 = le32_to_cpu(shptr[0]); | ||
170 | seghdr.sync2 = le32_to_cpu(shptr[1]); | ||
171 | seghdr.addr = le32_to_cpu(shptr[2]); | ||
172 | seghdr.size = le32_to_cpu(shptr[3]); | ||
173 | |||
169 | offset += sizeof(seghdr); | 174 | offset += sizeof(seghdr); |
170 | if (seghdr.sync1 != APU_ROM_SYNC1 || | 175 | if (seghdr.sync1 != APU_ROM_SYNC1 || |
171 | seghdr.sync2 != APU_ROM_SYNC2) { | 176 | seghdr.sync2 != APU_ROM_SYNC2) { |
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 " |