powerpc/pmac: Fix DMA ops for MacIO devices
[safe/jmp/linux-2.6] / drivers / macintosh / macio_asic.c
index e851266..a0f6838 100644 (file)
@@ -33,7 +33,7 @@
 
 #undef DEBUG
 
-#define MAX_NODE_NAME_SIZE (BUS_ID_SIZE - 12)
+#define MAX_NODE_NAME_SIZE (20 - 12)
 
 static struct macio_chip      *macio_on_hold;
 
@@ -240,7 +240,7 @@ static void macio_create_fixup_irq(struct macio_dev *dev, int index,
        if (irq != NO_IRQ) {
                dev->interrupt[index].start = irq;
                dev->interrupt[index].flags = IORESOURCE_IRQ;
-               dev->interrupt[index].name = dev->ofdev.dev.bus_id;
+               dev->interrupt[index].name = dev_name(&dev->ofdev.dev);
        }
        if (dev->n_interrupts <= index)
                dev->n_interrupts = index + 1;
@@ -303,7 +303,7 @@ static void macio_setup_interrupts(struct macio_dev *dev)
                        break;
                res->start = irq;
                res->flags = IORESOURCE_IRQ;
-               res->name = dev->ofdev.dev.bus_id;
+               res->name = dev_name(&dev->ofdev.dev);
                if (macio_resource_quirks(np, res, i - 1)) {
                        memset(res, 0, sizeof(struct resource));
                        continue;
@@ -325,7 +325,7 @@ static void macio_setup_resources(struct macio_dev *dev,
                if (index >= MACIO_DEV_COUNT_RESOURCES)
                        break;
                *res = r;
-               res->name = dev->ofdev.dev.bus_id;
+               res->name = dev_name(&dev->ofdev.dev);
 
                if (macio_resource_quirks(np, res, index)) {
                        memset(res, 0, sizeof(struct resource));
@@ -338,7 +338,7 @@ static void macio_setup_resources(struct macio_dev *dev,
                if (insert_resource(parent_res, res)) {
                        printk(KERN_WARNING "Can't request resource "
                               "%d for MacIO device %s\n",
-                              index, dev->ofdev.dev.bus_id);
+                              index, dev_name(&dev->ofdev.dev));
                }
        }
        dev->n_resources = index;
@@ -365,10 +365,9 @@ static struct macio_dev * macio_add_one_device(struct macio_chip *chip,
        if (np == NULL)
                return NULL;
 
-       dev = kmalloc(sizeof(*dev), GFP_KERNEL);
+       dev = kzalloc(sizeof(*dev), GFP_KERNEL);
        if (!dev)
                return NULL;
-       memset(dev, 0, sizeof(*dev));
 
        dev->bus = &chip->lbus;
        dev->media_bay = in_bay;
@@ -379,6 +378,17 @@ static struct macio_dev * macio_add_one_device(struct macio_chip *chip,
        dev->ofdev.dev.bus = &macio_bus_type;
        dev->ofdev.dev.release = macio_release_dev;
 
+#ifdef CONFIG_PCI
+       /* Set the DMA ops to the ones from the PCI device, this could be
+        * fishy if we didn't know that on PowerMac it's always direct ops
+        * or iommu ops that will work fine
+        */
+       dev->ofdev.dev.archdata.dma_ops =
+               chip->lbus.pdev->dev.archdata.dma_ops;
+       dev->ofdev.dev.archdata.dma_data =
+               chip->lbus.pdev->dev.archdata.dma_data;
+#endif /* CONFIG_PCI */
+
 #ifdef DEBUG
        printk("preparing mdev @%p, ofdev @%p, dev @%p, kobj @%p\n",
               dev, &dev->ofdev, &dev->ofdev.dev, &dev->ofdev.dev.kobj);
@@ -386,8 +396,8 @@ static struct macio_dev * macio_add_one_device(struct macio_chip *chip,
 
        /* MacIO itself has a different reg, we use it's PCI base */
        if (np == chip->of_node) {
-               sprintf(dev->ofdev.dev.bus_id, "%1d.%08x:%.*s",
-                       chip->lbus.index,
+               dev_set_name(&dev->ofdev.dev, "%1d.%08x:%.*s",
+                            chip->lbus.index,
 #ifdef CONFIG_PCI
                        (unsigned int)pci_resource_start(chip->lbus.pdev, 0),
 #else
@@ -395,10 +405,10 @@ static struct macio_dev * macio_add_one_device(struct macio_chip *chip,
 #endif
                        MAX_NODE_NAME_SIZE, np->name);
        } else {
-               reg = get_property(np, "reg", NULL);
-               sprintf(dev->ofdev.dev.bus_id, "%1d.%08x:%.*s",
-                       chip->lbus.index,
-                       reg ? *reg : 0, MAX_NODE_NAME_SIZE, np->name);
+               reg = of_get_property(np, "reg", NULL);
+               dev_set_name(&dev->ofdev.dev, "%1d.%08x:%.*s",
+                            chip->lbus.index,
+                            reg ? *reg : 0, MAX_NODE_NAME_SIZE, np->name);
        }
 
        /* Setup interrupts & resources */
@@ -409,7 +419,7 @@ static struct macio_dev * macio_add_one_device(struct macio_chip *chip,
        /* Register with core */
        if (of_device_register(&dev->ofdev) != 0) {
                printk(KERN_DEBUG"macio: device registration error for %s!\n",
-                      dev->ofdev.dev.bus_id);
+                      dev_name(&dev->ofdev.dev));
                kfree(dev);
                return NULL;
        }
@@ -559,7 +569,7 @@ err_out:
                resource_no,
                macio_resource_len(dev, resource_no),
                macio_resource_start(dev, resource_no),
-               dev->ofdev.dev.bus_id);
+               dev_name(&dev->ofdev.dev));
        return -EBUSY;
 }