#define HSU_PCI_CHAN_OFFSET    0x100
 
+#define PCI_DEVICE_ID_INTEL_MFLD_HSU_DMA       0x081e
+#define PCI_DEVICE_ID_INTEL_MRFLD_HSU_DMA      0x1192
+
 static irqreturn_t hsu_pci_irq(int irq, void *dev)
 {
        struct hsu_dma_chip *chip = dev;
+       struct pci_dev *pdev = to_pci_dev(chip->dev);
        u32 dmaisr;
        u32 status;
        unsigned short i;
        int ret = 0;
        int err;
 
+       /*
+        * On Intel Tangier B0 and Anniedale the interrupt line, disregarding
+        * to have different numbers, is shared between HSU DMA and UART IPs.
+        * Thus on such SoCs we are expecting that IRQ handler is called in
+        * UART driver only.
+        */
+       if (pdev->device == PCI_DEVICE_ID_INTEL_MRFLD_HSU_DMA)
+               return IRQ_HANDLED;
+
        dmaisr = readl(chip->regs + HSU_PCI_DMAISR);
        for (i = 0; i < chip->hsu->nr_channels; i++) {
                if (dmaisr & 0x1) {
 }
 
 static const struct pci_device_id hsu_pci_id_table[] = {
-       { PCI_VDEVICE(INTEL, 0x081e), 0 },
-       { PCI_VDEVICE(INTEL, 0x1192), 0 },
+       { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_MFLD_HSU_DMA), 0 },
+       { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_MRFLD_HSU_DMA), 0 },
        { }
 };
 MODULE_DEVICE_TABLE(pci, hsu_pci_id_table);
 
        return 0;
 }
 
+static int tng_handle_irq(struct uart_port *p)
+{
+       struct mid8250 *mid = p->private_data;
+       struct uart_8250_port *up = up_to_u8250p(p);
+       struct hsu_dma_chip *chip;
+       u32 status;
+       int ret = 0;
+       int err;
+
+       chip = pci_get_drvdata(mid->dma_dev);
+
+       /* Rx DMA */
+       err = hsu_dma_get_status(chip, mid->dma_index * 2 + 1, &status);
+       if (err > 0) {
+               serial8250_rx_dma_flush(up);
+               ret |= 1;
+       } else if (err == 0)
+               ret |= hsu_dma_do_irq(chip, mid->dma_index * 2 + 1, status);
+
+       /* Tx DMA */
+       err = hsu_dma_get_status(chip, mid->dma_index * 2, &status);
+       if (err > 0)
+               ret |= 1;
+       else if (err == 0)
+               ret |= hsu_dma_do_irq(chip, mid->dma_index * 2, status);
+
+       /* UART */
+       ret |= serial8250_handle_irq(p, serial_port_in(p, UART_IIR));
+       return IRQ_RETVAL(ret);
+}
+
 static int tng_setup(struct mid8250 *mid, struct uart_port *p)
 {
        struct pci_dev *pdev = to_pci_dev(p->dev);
 
        mid->dma_index = index;
        mid->dma_dev = pci_get_slot(pdev->bus, PCI_DEVFN(5, 0));
+
+       p->handle_irq = tng_handle_irq;
        return 0;
 }