x86: Use the IRQ device when setting up the mptable
authorSimon Glass <sjg@chromium.org>
Wed, 20 Jan 2016 04:32:28 +0000 (21:32 -0700)
committerBin Meng <bmeng.cn@gmail.com>
Sun, 24 Jan 2016 04:07:18 +0000 (12:07 +0800)
Instead of searching for the device tree node, use the IRQ device which has
a record of it.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Tested-by: Bin Meng <bmeng.cn@gmail.com>
arch/x86/cpu/irq.c
arch/x86/lib/mpspec.c

index e2feba7b6178bcc113762369e0ab5c05596997a5..d6151e085aadc023697653b6924ac1da5469e893 100644 (file)
@@ -88,7 +88,7 @@ __weak void cpu_irq_init(void)
        return;
 }
 
-static int create_pirq_routing_table(void)
+static int create_pirq_routing_table(struct udevice *dev)
 {
        const void *blob = gd->fdt_blob;
        struct fdt_pci_addr addr;
@@ -102,16 +102,8 @@ static int create_pirq_routing_table(void)
        int i;
        int ret;
 
-       node = fdtdec_next_compatible(blob, 0, COMPAT_INTEL_IRQ_ROUTER);
-       if (node < 0) {
-               debug("%s: Cannot find irq router node\n", __func__);
-               return -EINVAL;
-       }
-
-       /* TODO(sjg@chromium.org): Drop this when PIRQ is a driver */
-       parent = fdt_parent_offset(blob, node);
-       if (parent < 0)
-               return -EINVAL;
+       node = dev->of_offset;
+       parent = dev->parent->of_offset;
        ret = fdtdec_get_pci_addr(blob, parent, FDT_PCI_SPACE_CONFIG,
                                  "reg", &addr);
        if (ret)
@@ -237,7 +229,7 @@ int irq_router_common_init(struct udevice *dev)
 
        cpu_irq_init();
 
-       ret = create_pirq_routing_table();
+       ret = create_pirq_routing_table(dev);
        if (ret) {
                debug("Failed to create pirq routing table\n");
                return ret;
index f3ad116316a9541953c39c0f13709d96a3e44777..0faa582d772d4608dea2b178e4330376e29ea629 100644 (file)
@@ -292,19 +292,19 @@ static int mptable_add_intsrc(struct mp_config_table *mc,
        struct mpc_config_intsrc *intsrc_base;
        int intsrc_entries = 0;
        const void *blob = gd->fdt_blob;
-       int node;
+       struct udevice *dev;
        int len, count;
        const u32 *cell;
-       int i;
+       int i, ret;
 
-       /* Get I/O interrupt information from device tree */
-       node = fdtdec_next_compatible(blob, 0, COMPAT_INTEL_IRQ_ROUTER);
-       if (node < 0) {
+       ret = uclass_first_device(UCLASS_IRQ, &dev);
+       if (ret && ret != -ENODEV) {
                debug("%s: Cannot find irq router node\n", __func__);
-               return -ENOENT;
+               return ret;
        }
 
-       cell = fdt_getprop(blob, node, "intel,pirq-routing", &len);
+       /* Get I/O interrupt information from device tree */
+       cell = fdt_getprop(blob, dev->of_offset, "intel,pirq-routing", &len);
        if (!cell)
                return -ENOENT;