idma64->dma.directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV);
        idma64->dma.residue_granularity = DMA_RESIDUE_GRANULARITY_BURST;
 
-       idma64->dma.dev = chip->dev;
+       idma64->dma.dev = chip->sysdev;
 
        dma_set_max_seg_size(idma64->dma.dev, IDMA64C_CTLH_BLOCK_TS_MASK);
 
 {
        struct idma64_chip *chip;
        struct device *dev = &pdev->dev;
+       struct device *sysdev = dev->parent;
        struct resource *mem;
        int ret;
 
        if (IS_ERR(chip->regs))
                return PTR_ERR(chip->regs);
 
-       ret = dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
+       ret = dma_coerce_mask_and_coherent(sysdev, DMA_BIT_MASK(64));
        if (ret)
                return ret;
 
        chip->dev = dev;
+       chip->sysdev = sysdev;
 
        ret = idma64_probe(chip);
        if (ret)
 
 /**
  * struct idma64_chip - representation of iDMA 64-bit controller hardware
  * @dev:               struct device of the DMA controller
+ * @sysdev:            struct device of the physical device that does DMA
  * @irq:               irq line
  * @regs:              memory mapped I/O space
  * @idma64:            struct idma64 that is filed by idma64_probe()
  */
 struct idma64_chip {
        struct device   *dev;
+       struct device   *sysdev;
        int             irq;
        void __iomem    *regs;
        struct idma64   *idma64;
 
 
 static bool pxa2xx_spi_idma_filter(struct dma_chan *chan, void *param)
 {
-       struct device *dev = param;
-
-       if (dev != chan->device->dev->parent)
-               return false;
-
-       return true;
+       return param == chan->device->dev;
 }
 
 #endif /* CONFIG_PCI */
 
 
 static bool dw8250_idma_filter(struct dma_chan *chan, void *param)
 {
-       return param == chan->device->dev->parent;
+       return param == chan->device->dev;
 }
 
 /*
                data->uart_16550_compatible = true;
        }
 
-       /* Platforms with iDMA */
+       /* Platforms with iDMA 64-bit */
        if (platform_get_resource_byname(to_platform_device(p->dev),
                                         IORESOURCE_MEM, "lpss_priv")) {
                data->dma.rx_param = p->dev->parent;