PNP: dont sort by type in /sys/.../resources
authorBjorn Helgaas <bjorn.helgaas@hp.com>
Fri, 27 Jun 2008 22:57:00 +0000 (16:57 -0600)
committerAndi Kleen <andi@basil.nowhere.org>
Wed, 16 Jul 2008 21:27:06 +0000 (23:27 +0200)
Rather than stepping through all IO resources, then stepping through
all MMIO resources, etc., we can just iterate over the resource list
once directly.

This can change the order in /sys, e.g.,

    # cat /sys/devices/pnp0/00:07/resources     # OLD
    state = active
    io 0x3f8-0x3ff
    irq 4

    # cat /sys/devices/pnp0/00:07/resources     # NEW
    state = active
    irq 4
    io 0x3f8-0x3ff

The old code artificially sorted resources by type; the new code
just lists them in the order we read them from the ISAPNP hardware
or the BIOS.

Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
Signed-off-by: Len Brown <len.brown@intel.com>
Signed-off-by: Andi Kleen <ak@linux.intel.com>
drivers/pnp/interface.c

index 7fc86bbed88e44f36c6ed298d96076c360eea295..674e8ba0377f9fe48105a58917de6c97d205e5c1 100644 (file)
@@ -248,8 +248,9 @@ static ssize_t pnp_show_current_resources(struct device *dmdev,
                                          char *buf)
 {
        struct pnp_dev *dev = to_pnp_dev(dmdev);
+       struct pnp_resource *pnp_res;
        struct resource *res;
-       int i, ret;
+       int ret;
        pnp_info_buffer_t *buffer;
 
        if (!dev)
@@ -262,46 +263,33 @@ static ssize_t pnp_show_current_resources(struct device *dmdev,
        buffer->buffer = buf;
        buffer->curr = buffer->buffer;
 
-       pnp_printf(buffer, "state = ");
-       if (dev->active)
-               pnp_printf(buffer, "active\n");
-       else
-               pnp_printf(buffer, "disabled\n");
+       pnp_printf(buffer, "state = %s\n", dev->active ? "active" : "disabled");
 
-       for (i = 0; (res = pnp_get_resource(dev, IORESOURCE_IO, i)); i++) {
-               pnp_printf(buffer, "io");
-               if (res->flags & IORESOURCE_DISABLED)
-                       pnp_printf(buffer, " disabled\n");
-               else
-                       pnp_printf(buffer, " 0x%llx-0x%llx\n",
-                                  (unsigned long long) res->start,
-                                  (unsigned long long) res->end);
-       }
-       for (i = 0; (res = pnp_get_resource(dev, IORESOURCE_MEM, i)); i++) {
-               pnp_printf(buffer, "mem");
-               if (res->flags & IORESOURCE_DISABLED)
+       list_for_each_entry(pnp_res, &dev->resources, list) {
+               res = &pnp_res->res;
+
+               pnp_printf(buffer, pnp_resource_type_name(res));
+
+               if (res->flags & IORESOURCE_DISABLED) {
                        pnp_printf(buffer, " disabled\n");
-               else
-                       pnp_printf(buffer, " 0x%llx-0x%llx\n",
+                       continue;
+               }
+
+               switch (pnp_resource_type(res)) {
+               case IORESOURCE_IO:
+               case IORESOURCE_MEM:
+                       pnp_printf(buffer, " %#llx-%#llx\n",
                                   (unsigned long long) res->start,
                                   (unsigned long long) res->end);
-       }
-       for (i = 0; (res = pnp_get_resource(dev, IORESOURCE_IRQ, i)); i++) {
-               pnp_printf(buffer, "irq");
-               if (res->flags & IORESOURCE_DISABLED)
-                       pnp_printf(buffer, " disabled\n");
-               else
-                       pnp_printf(buffer, " %lld\n",
-                                  (unsigned long long) res->start);
-       }
-       for (i = 0; (res = pnp_get_resource(dev, IORESOURCE_DMA, i)); i++) {
-               pnp_printf(buffer, "dma");
-               if (res->flags & IORESOURCE_DISABLED)
-                       pnp_printf(buffer, " disabled\n");
-               else
+                       break;
+               case IORESOURCE_IRQ:
+               case IORESOURCE_DMA:
                        pnp_printf(buffer, " %lld\n",
                                   (unsigned long long) res->start);
+                       break;
+               }
        }
+
        ret = (buffer->curr - buf);
        kfree(buffer);
        return ret;