iommu/exynos: Drop IOVA cookie management
[linux-2.6-microblaze.git] / drivers / uio / uio_pci_generic.c
index 3bb0b00..e03f9b5 100644 (file)
@@ -72,7 +72,9 @@ static int probe(struct pci_dev *pdev,
                           const struct pci_device_id *id)
 {
        struct uio_pci_generic_dev *gdev;
+       struct uio_mem *uiomem;
        int err;
+       int i;
 
        err = pcim_enable_device(pdev);
        if (err) {
@@ -101,6 +103,36 @@ static int probe(struct pci_dev *pdev,
                         "no support for interrupts?\n");
        }
 
+       uiomem = &gdev->info.mem[0];
+       for (i = 0; i < MAX_UIO_MAPS; ++i) {
+               struct resource *r = &pdev->resource[i];
+
+               if (r->flags != (IORESOURCE_SIZEALIGN | IORESOURCE_MEM))
+                       continue;
+
+               if (uiomem >= &gdev->info.mem[MAX_UIO_MAPS]) {
+                       dev_warn(
+                               &pdev->dev,
+                               "device has more than " __stringify(
+                                       MAX_UIO_MAPS) " I/O memory resources.\n");
+                       break;
+               }
+
+               uiomem->memtype = UIO_MEM_PHYS;
+               uiomem->addr = r->start & PAGE_MASK;
+               uiomem->offs = r->start & ~PAGE_MASK;
+               uiomem->size =
+                       (uiomem->offs + resource_size(r) + PAGE_SIZE - 1) &
+                       PAGE_MASK;
+               uiomem->name = r->name;
+               ++uiomem;
+       }
+
+       while (uiomem < &gdev->info.mem[MAX_UIO_MAPS]) {
+               uiomem->size = 0;
+               ++uiomem;
+       }
+
        return devm_uio_register_device(&pdev->dev, &gdev->info);
 }