]> err.no Git - linux-2.6/blobdiff - drivers/macintosh/macio_asic.c
[PATCH] Add macio_bus_type probe and remove methods
[linux-2.6] / drivers / macintosh / macio_asic.c
index f14c744a94efafad5e8f73e2a8d5ad60d055ba8b..ed6d3174d66050f1ca3358909469770682111243 100644 (file)
@@ -211,6 +211,9 @@ struct bus_type macio_bus_type = {
        .name   = "macio",
        .match  = macio_bus_match,
        .uevent = macio_uevent,
+       .probe  = macio_device_probe,
+       .remove = macio_device_remove,
+       .shutdown = macio_device_shutdown,
        .suspend        = macio_device_suspend,
        .resume = macio_device_resume,
        .dev_attrs = macio_dev_attrs,
@@ -256,42 +259,42 @@ static int macio_resource_quirks(struct device_node *np, struct resource *res,
 {
        if (res->flags & IORESOURCE_MEM) {
                /* Grand Central has too large resource 0 on some machines */
-               if (index == 0 && !strcmp(np->name, "gc")) {
-                       np->addrs[0].size = 0x20000;
+               if (index == 0 && !strcmp(np->name, "gc"))
                        res->end = res->start + 0x1ffff;
-               }
+
                /* Airport has bogus resource 2 */
                if (index >= 2 && !strcmp(np->name, "radio"))
                        return 1;
+
+#ifndef CONFIG_PPC64
                /* DBDMAs may have bogus sizes */
-               if ((res->start & 0x0001f000) == 0x00008000) {
-                       np->addrs[index].size = 0x100;
+               if ((res->start & 0x0001f000) == 0x00008000)
                        res->end = res->start + 0xff;
-               }
+#endif /* CONFIG_PPC64 */
+
                /* ESCC parent eats child resources. We could have added a
                 * level of hierarchy, but I don't really feel the need
                 * for it
                 */
                if (!strcmp(np->name, "escc"))
                        return 1;
+
                /* ESCC has bogus resources >= 3 */
                if (index >= 3 && !(strcmp(np->name, "ch-a") &&
                                    strcmp(np->name, "ch-b")))
                        return 1;
+
                /* Media bay has too many resources, keep only first one */
                if (index > 0 && !strcmp(np->name, "media-bay"))
                        return 1;
+
                /* Some older IDE resources have bogus sizes */
                if (!(strcmp(np->name, "IDE") && strcmp(np->name, "ATA") &&
                      strcmp(np->type, "ide") && strcmp(np->type, "ata"))) {
-                       if (index == 0 && np->addrs[0].size > 0x1000) {
-                               np->addrs[0].size = 0x1000;
+                       if (index == 0 && (res->end - res->start) > 0xfff)
                                res->end = res->start + 0xfff;
-                       }
-                       if (index == 1 && np->addrs[1].size > 0x100) {
-                               np->addrs[1].size = 0x100;
+                       if (index == 1 && (res->end - res->start) > 0xff)
                                res->end = res->start + 0xff;
-                       }
                }
        }
        return 0;
@@ -332,18 +335,14 @@ static void macio_setup_resources(struct macio_dev *dev,
                                  struct resource *parent_res)
 {
        struct device_node *np = dev->ofdev.node;
-       u32 *addr;
-       u64 size;
+       struct resource r;
        int index;
 
-       for (index = 0; (addr = of_get_address(np, index, &size)) != NULL;
-            index++) {
+       for (index = 0; of_address_to_resource(np, index, &r) == 0; index++) {
                struct resource *res = &dev->resource[index];
                if (index >= MACIO_DEV_COUNT_RESOURCES)
                        break;
-               res->start = of_translate_address(np, addr);
-               res->end = res->start + (unsigned long)size - 1;
-               res->flags = IORESOURCE_MEM;
+               *res = r;
                res->name = dev->ofdev.dev.bus_id;
 
                if (macio_resource_quirks(np, res, index)) {
@@ -532,9 +531,6 @@ int macio_register_driver(struct macio_driver *drv)
        /* initialize common driver fields */
        drv->driver.name = drv->name;
        drv->driver.bus = &macio_bus_type;
-       drv->driver.probe = macio_device_probe;
-       drv->driver.remove = macio_device_remove;
-       drv->driver.shutdown = macio_device_shutdown;
 
        /* register with core */
        count = driver_register(&drv->driver);