/* Private data per function */
 struct zpci_dev {
-       struct pci_dev  *pdev;
        struct pci_bus  *bus;
        struct list_head entry;         /* list of all zpci_devices, needed for hotplug, etc. */
 
 /* Debug */
 int zpci_debug_init(void);
 void zpci_debug_exit(void);
-void zpci_debug_init_device(struct zpci_dev *);
+void zpci_debug_init_device(struct zpci_dev *, const char *);
 void zpci_debug_exit_device(struct zpci_dev *);
 void zpci_debug_info(struct zpci_dev *, struct seq_file *);
 
 
 
 int pcibios_add_device(struct pci_dev *pdev)
 {
-       struct zpci_dev *zdev = to_zpci(pdev);
        struct resource *res;
        int i;
 
-       zdev->pdev = pdev;
        pdev->dev.groups = zpci_attr_groups;
        zpci_map_resources(pdev);
 
 {
        struct zpci_dev *zdev = to_zpci(pdev);
 
-       zdev->pdev = pdev;
-       zpci_debug_init_device(zdev);
+       zpci_debug_init_device(zdev, dev_name(&pdev->dev));
        zpci_fmb_enable_device(zdev);
 
        return pci_enable_resources(pdev, mask);
 
        zpci_fmb_disable_device(zdev);
        zpci_debug_exit_device(zdev);
-       zdev->pdev = NULL;
 }
 
 #ifdef CONFIG_HIBERNATE_CALLBACKS
 
        .release = single_release,
 };
 
-void zpci_debug_init_device(struct zpci_dev *zdev)
+void zpci_debug_init_device(struct zpci_dev *zdev, const char *name)
 {
-       zdev->debugfs_dev = debugfs_create_dir(dev_name(&zdev->pdev->dev),
-                                              debugfs_root);
+       zdev->debugfs_dev = debugfs_create_dir(name, debugfs_root);
        if (IS_ERR(zdev->debugfs_dev))
                zdev->debugfs_dev = NULL;
 
 
        dma_free_cpu_table(table);
 }
 
-static unsigned long __dma_alloc_iommu(struct zpci_dev *zdev,
+static unsigned long __dma_alloc_iommu(struct device *dev,
                                       unsigned long start, int size)
 {
+       struct zpci_dev *zdev = to_zpci(to_pci_dev(dev));
        unsigned long boundary_size;
 
-       boundary_size = ALIGN(dma_get_seg_boundary(&zdev->pdev->dev) + 1,
+       boundary_size = ALIGN(dma_get_seg_boundary(dev) + 1,
                              PAGE_SIZE) >> PAGE_SHIFT;
        return iommu_area_alloc(zdev->iommu_bitmap, zdev->iommu_pages,
                                start, size, 0, boundary_size, 0);
 }
 
-static unsigned long dma_alloc_iommu(struct zpci_dev *zdev, int size)
+static unsigned long dma_alloc_iommu(struct device *dev, int size)
 {
+       struct zpci_dev *zdev = to_zpci(to_pci_dev(dev));
        unsigned long offset, flags;
        int wrap = 0;
 
        spin_lock_irqsave(&zdev->iommu_bitmap_lock, flags);
-       offset = __dma_alloc_iommu(zdev, zdev->next_bit, size);
+       offset = __dma_alloc_iommu(dev, zdev->next_bit, size);
        if (offset == -1) {
                /* wrap-around */
-               offset = __dma_alloc_iommu(zdev, 0, size);
+               offset = __dma_alloc_iommu(dev, 0, size);
                wrap = 1;
        }
 
        return offset;
 }
 
-static void dma_free_iommu(struct zpci_dev *zdev, unsigned long offset, int size)
+static void dma_free_iommu(struct device *dev, unsigned long offset, int size)
 {
+       struct zpci_dev *zdev = to_zpci(to_pci_dev(dev));
        unsigned long flags;
 
        spin_lock_irqsave(&zdev->iommu_bitmap_lock, flags);
 
        /* This rounds up number of pages based on size and offset */
        nr_pages = iommu_num_pages(pa, size, PAGE_SIZE);
-       iommu_page_index = dma_alloc_iommu(zdev, nr_pages);
+       iommu_page_index = dma_alloc_iommu(dev, nr_pages);
        if (iommu_page_index == -1) {
                ret = -ENOSPC;
                goto out_err;
        return dma_addr + (offset & ~PAGE_MASK);
 
 out_free:
-       dma_free_iommu(zdev, iommu_page_index, nr_pages);
+       dma_free_iommu(dev, iommu_page_index, nr_pages);
 out_err:
        zpci_err("map error:\n");
        zpci_err_dma(ret, pa);
 
        atomic64_add(npages, &zdev->unmapped_pages);
        iommu_page_index = (dma_addr - zdev->start_dma) >> PAGE_SHIFT;
-       dma_free_iommu(zdev, iommu_page_index, npages);
+       dma_free_iommu(dev, iommu_page_index, npages);
 }
 
 static void *s390_dma_alloc(struct device *dev, size_t size,
 
 static void __zpci_event_error(struct zpci_ccdf_err *ccdf)
 {
        struct zpci_dev *zdev = get_zdev_by_fid(ccdf->fid);
-       struct pci_dev *pdev = zdev ? zdev->pdev : NULL;
+       struct pci_dev *pdev = NULL;
 
        zpci_err("error CCDF:\n");
        zpci_err_hex(ccdf, sizeof(*ccdf));
 
+       if (zdev)
+               pdev = pci_get_slot(zdev->bus, ZPCI_DEVFN);
+
        pr_err("%s: Event 0x%x reports an error for PCI function 0x%x\n",
               pdev ? pci_name(pdev) : "n/a", ccdf->pec, ccdf->fid);
 
                return;
 
        pdev->error_state = pci_channel_io_perm_failure;
+       pci_dev_put(pdev);
 }
 
 void zpci_event_error(void *data)
 static void __zpci_event_availability(struct zpci_ccdf_avail *ccdf)
 {
        struct zpci_dev *zdev = get_zdev_by_fid(ccdf->fid);
-       struct pci_dev *pdev = zdev ? zdev->pdev : NULL;
+       struct pci_dev *pdev = NULL;
        int ret;
 
+       if (zdev)
+               pdev = pci_get_slot(zdev->bus, ZPCI_DEVFN);
+
        pr_info("%s: Event 0x%x reconfigured PCI function 0x%x\n",
                pdev ? pci_name(pdev) : "n/a", ccdf->pec, ccdf->fid);
        zpci_err("avail CCDF:\n");
        default:
                break;
        }
+       if (pdev)
+               pci_dev_put(pdev);
 }
 
 void zpci_event_availability(void *data)
 
 static int disable_slot(struct hotplug_slot *hotplug_slot)
 {
        struct slot *slot = hotplug_slot->private;
+       struct pci_dev *pdev;
        int rc;
 
        if (!zpci_fn_configured(slot->zdev->state))
                return -EIO;
 
-       if (slot->zdev->pdev)
-               pci_stop_and_remove_bus_device_locked(slot->zdev->pdev);
+       pdev = pci_get_slot(slot->zdev->bus, ZPCI_DEVFN);
+       if (pdev) {
+               pci_stop_and_remove_bus_device_locked(pdev);
+               pci_dev_put(pdev);
+       }
 
        rc = zpci_disable_device(slot->zdev);
        if (rc)