return 0;
 }
 
-static void clone_aliases(struct pci_dev *pdev)
+static void clone_aliases(struct device *dev)
 {
-       if (!pdev)
+       struct pci_dev *pdev;
+
+       if (!dev_is_pci(dev))
                return;
+       pdev = to_pci_dev(dev);
 
        /*
         * The IVRS alias stored in the alias table may not be
        pci_for_each_dma_alias(pdev, clone_alias, NULL);
 }
 
-static struct pci_dev *setup_aliases(struct device *dev)
+static void setup_aliases(struct device *dev)
 {
        struct pci_dev *pdev = to_pci_dev(dev);
        u16 ivrs_alias;
 
        /* For ACPI HID devices, there are no aliases */
        if (!dev_is_pci(dev))
-               return NULL;
+               return;
 
        /*
         * Add the IVRS alias to the pci aliases if it is on the same
            PCI_BUS_NUM(ivrs_alias) == pdev->bus->number)
                pci_add_dma_alias(pdev, ivrs_alias & 0xff, 1);
 
-       clone_aliases(pdev);
-
-       return pdev;
+       clone_aliases(dev);
 }
 
 static struct iommu_dev_data *find_dev_data(u16 devid)
        if (!dev_data)
                return -ENOMEM;
 
-       dev_data->pdev = setup_aliases(dev);
+       dev_data->dev = dev;
+       setup_aliases(dev);
 
        /*
         * By default we use passthrough mode for IOMMUv2 capable device.
 static int device_flush_dte(struct iommu_dev_data *dev_data)
 {
        struct amd_iommu *iommu;
+       struct pci_dev *pdev = NULL;
        u16 alias;
        int ret;
 
        iommu = amd_iommu_rlookup_table[dev_data->devid];
 
-       if (dev_data->pdev)
-               ret = pci_for_each_dma_alias(dev_data->pdev,
+       if (dev_is_pci(dev_data->dev))
+               pdev = to_pci_dev(dev_data->dev);
+
+       if (pdev)
+               ret = pci_for_each_dma_alias(pdev,
                                             device_flush_dte_alias, iommu);
        else
                ret = iommu_flush_dte(iommu, dev_data->devid);
        /* Update device table */
        set_dte_entry(dev_data->devid, domain,
                      ats, dev_data->iommu_v2);
-       clone_aliases(dev_data->pdev);
+       clone_aliases(dev_data->dev);
 
        device_flush_dte(dev_data);
 }
        dev_data->domain = NULL;
        list_del(&dev_data->list);
        clear_dte_entry(dev_data->devid);
-       clone_aliases(dev_data->pdev);
+       clone_aliases(dev_data->dev);
 
        /* Flush the DTE entry */
        device_flush_dte(dev_data);
        list_for_each_entry(dev_data, &domain->dev_list, list) {
                set_dte_entry(dev_data->devid, domain,
                              dev_data->ats.enabled, dev_data->iommu_v2);
-               clone_aliases(dev_data->pdev);
+               clone_aliases(dev_data->dev);
        }
 }