#include <linux/err.h>
 #include <linux/interrupt.h>
 #include <linux/dma/edma.h>
-#include <linux/pci.h>
+#include <linux/dma-mapping.h>
 
 #include "dw-edma-core.h"
 #include "dw-edma-v0-core.h"
 
        if (dw->nr_irqs == 1) {
                /* Common IRQ shared among all channels */
-               err = request_irq(pci_irq_vector(to_pci_dev(dev), 0),
+               err = request_irq(dw->ops->irq_vector(dev, 0),
                                  dw_edma_interrupt_common,
                                  IRQF_SHARED, dw->name, &dw->irq[0]);
                if (err) {
                        return err;
                }
 
-               get_cached_msi_msg(pci_irq_vector(to_pci_dev(dev), 0),
+               get_cached_msi_msg(dw->ops->irq_vector(dev, 0),
                                   &dw->irq[0].msi);
        } else {
                /* Distribute IRQs equally among all channels */
                dw_edma_add_irq_mask(&rd_mask, *rd_alloc, dw->rd_ch_cnt);
 
                for (i = 0; i < (*wr_alloc + *rd_alloc); i++) {
-                       err = request_irq(pci_irq_vector(to_pci_dev(dev), i),
+                       err = request_irq(dw->ops->irq_vector(dev, i),
                                          i < *wr_alloc ?
                                                dw_edma_interrupt_write :
                                                dw_edma_interrupt_read,
                                return err;
                        }
 
-                       get_cached_msi_msg(pci_irq_vector(to_pci_dev(dev), i),
+                       get_cached_msi_msg(dw->ops->irq_vector(dev, i),
                                           &dw->irq[i].msi);
                }
 
 
 int dw_edma_probe(struct dw_edma_chip *chip)
 {
-       struct device *dev = chip->dev;
-       struct dw_edma *dw = chip->dw;
+       struct device *dev;
+       struct dw_edma *dw;
        u32 wr_alloc = 0;
        u32 rd_alloc = 0;
        int i, err;
 
+       if (!chip)
+               return -EINVAL;
+
+       dev = chip->dev;
+       if (!dev)
+               return -EINVAL;
+
+       dw = chip->dw;
+       if (!dw || !dw->irq || !dw->ops || !dw->ops->irq_vector)
+               return -EINVAL;
+
        raw_spin_lock_init(&dw->lock);
 
        /* Find out how many write channels are supported by hardware */
 
 err_irq_free:
        for (i = (dw->nr_irqs - 1); i >= 0; i--)
-               free_irq(pci_irq_vector(to_pci_dev(dev), i), &dw->irq[i]);
+               free_irq(dw->ops->irq_vector(dev, i), &dw->irq[i]);
 
        dw->nr_irqs = 0;
 
 
        /* Free irqs */
        for (i = (dw->nr_irqs - 1); i >= 0; i--)
-               free_irq(pci_irq_vector(to_pci_dev(dev), i), &dw->irq[i]);
+               free_irq(dw->ops->irq_vector(dev, i), &dw->irq[i]);
 
        /* Power management */
        pm_runtime_disable(dev);
 
        .irqs                           = 1,
 };
 
+static int dw_edma_pcie_irq_vector(struct device *dev, unsigned int nr)
+{
+       return pci_irq_vector(to_pci_dev(dev), nr);
+}
+
+static const struct dw_edma_core_ops dw_edma_pcie_core_ops = {
+       .irq_vector = dw_edma_pcie_irq_vector,
+};
+
 static int dw_edma_pcie_probe(struct pci_dev *pdev,
                              const struct pci_device_id *pid)
 {
        dw->version = pdata->version;
        dw->mode = pdata->mode;
        dw->nr_irqs = nr_irqs;
+       dw->ops = &dw_edma_pcie_core_ops;
 
        /* Debug info */
        pci_dbg(pdev, "Version:\t%u\n", dw->version);