Skip to content

Commit

Permalink
powerpc: Update currituck pci/usb fixup for new board revision
Browse files Browse the repository at this point in the history
The currituck board uses a different IRQ for the pci usb host
controller depending on the board revision. This patch adds support
for newer board revisions by retrieving the board revision from the
FPGA and mapping the appropriate IRQ.

Signed-off-by: Alistair Popple <alistair@popple.id.au>
Acked-by: Tony Breeds <tony@bakeyournoodle.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
  • Loading branch information
Alistair Popple authored and Benjamin Herrenschmidt committed Jun 20, 2013
1 parent 70a54a4 commit ab9a418
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 2 deletions.
5 changes: 5 additions & 0 deletions arch/powerpc/boot/dts/currituck.dts
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,11 @@
interrupts = <34 2>;
};

FPGA0: fpga@50000000 {
compatible = "ibm,currituck-fpga";
reg = <0x50000000 0x4>;
};

IIC0: i2c@00000000 {
compatible = "ibm,iic-currituck", "ibm,iic";
reg = <0x0 0x00000014>;
Expand Down
39 changes: 37 additions & 2 deletions arch/powerpc/platforms/44x/currituck.c
Original file line number Diff line number Diff line change
Expand Up @@ -176,13 +176,48 @@ static int __init ppc47x_probe(void)
return 1;
}

static int board_rev = -1;
static int __init ppc47x_get_board_rev(void)
{
u8 fpga_reg0;
void *fpga;
struct device_node *np;

np = of_find_compatible_node(NULL, NULL, "ibm,currituck-fpga");
if (!np)
goto fail;

fpga = of_iomap(np, 0);
of_node_put(np);
if (!fpga)
goto fail;

fpga_reg0 = ioread8(fpga);
board_rev = fpga_reg0 & 0x03;
pr_info("%s: Found board revision %d\n", __func__, board_rev);
iounmap(fpga);
return 0;

fail:
pr_info("%s: Unable to find board revision\n", __func__);
return 0;
}
machine_arch_initcall(ppc47x, ppc47x_get_board_rev);

/* Use USB controller should have been hardware swizzled but it wasn't :( */
static void ppc47x_pci_irq_fixup(struct pci_dev *dev)
{
if (dev->vendor == 0x1033 && (dev->device == 0x0035 ||
dev->device == 0x00e0)) {
dev->irq = irq_create_mapping(NULL, 47);
pr_info("%s: Mapping irq 47 %d\n", __func__, dev->irq);
if (board_rev == 0) {
dev->irq = irq_create_mapping(NULL, 47);
pr_info("%s: Mapping irq %d\n", __func__, dev->irq);
} else if (board_rev == 2) {
dev->irq = irq_create_mapping(NULL, 49);
pr_info("%s: Mapping irq %d\n", __func__, dev->irq);
} else {
pr_alert("%s: Unknown board revision\n", __func__);
}
}
}

Expand Down

0 comments on commit ab9a418

Please sign in to comment.