Commit 8b2979fe authored by Even Xu's avatar Even Xu Committed by Jiri Kosina

HID: intel-ish-hid: Move DMA disable code to new function

Add a new function ish_disable_dma() and move DMA disable operations
here, so that this functionality can be reused.
Signed-off-by: default avatarEven Xu <even.xu@intel.com>
Acked-by: default avatarSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent c2ed83f5
...@@ -637,6 +637,36 @@ irqreturn_t ish_irq_handler(int irq, void *dev_id) ...@@ -637,6 +637,36 @@ irqreturn_t ish_irq_handler(int irq, void *dev_id)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
/**
* ish_disable_dma() - disable dma communication between host and ISHFW
* @dev: ishtp device pointer
*
* Clear the dma enable bit and wait for dma inactive.
*
* Return: 0 for success else error code.
*/
static int ish_disable_dma(struct ishtp_device *dev)
{
unsigned int dma_delay;
/* Clear the dma enable bit */
ish_reg_write(dev, IPC_REG_ISH_RMP2, 0);
/* wait for dma inactive */
for (dma_delay = 0; dma_delay < MAX_DMA_DELAY &&
_ish_read_fw_sts_reg(dev) & (IPC_ISH_IN_DMA);
dma_delay += 5)
mdelay(5);
if (dma_delay >= MAX_DMA_DELAY) {
dev_err(dev->devc,
"Wait for DMA inactive timeout\n");
return -EBUSY;
}
return 0;
}
/** /**
* ish_wakeup() - wakeup ishfw from waiting-for-host state * ish_wakeup() - wakeup ishfw from waiting-for-host state
* @dev: ishtp device pointer * @dev: ishtp device pointer
...@@ -671,7 +701,6 @@ static int _ish_hw_reset(struct ishtp_device *dev) ...@@ -671,7 +701,6 @@ static int _ish_hw_reset(struct ishtp_device *dev)
{ {
struct pci_dev *pdev = dev->pdev; struct pci_dev *pdev = dev->pdev;
int rv; int rv;
unsigned int dma_delay;
uint16_t csr; uint16_t csr;
if (!pdev) if (!pdev)
...@@ -686,15 +715,8 @@ static int _ish_hw_reset(struct ishtp_device *dev) ...@@ -686,15 +715,8 @@ static int _ish_hw_reset(struct ishtp_device *dev)
return -EINVAL; return -EINVAL;
} }
/* Now trigger reset to FW */ /* Disable dma communication between FW and host */
ish_reg_write(dev, IPC_REG_ISH_RMP2, 0); if (ish_disable_dma(dev)) {
for (dma_delay = 0; dma_delay < MAX_DMA_DELAY &&
_ish_read_fw_sts_reg(dev) & (IPC_ISH_IN_DMA);
dma_delay += 5)
mdelay(5);
if (dma_delay >= MAX_DMA_DELAY) {
dev_err(&pdev->dev, dev_err(&pdev->dev,
"Can't reset - stuck with DMA in-progress\n"); "Can't reset - stuck with DMA in-progress\n");
return -EBUSY; return -EBUSY;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment