mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-27 19:29:37 +00:00
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: Even Xu <even.xu@intel.com> Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
This commit is contained in:
parent
c2ed83f542
commit
8b2979febc
1 changed files with 32 additions and 10 deletions
|
@ -637,6 +637,36 @@ irqreturn_t ish_irq_handler(int irq, void *dev_id)
|
|||
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
|
||||
* @dev: ishtp device pointer
|
||||
|
@ -671,7 +701,6 @@ static int _ish_hw_reset(struct ishtp_device *dev)
|
|||
{
|
||||
struct pci_dev *pdev = dev->pdev;
|
||||
int rv;
|
||||
unsigned int dma_delay;
|
||||
uint16_t csr;
|
||||
|
||||
if (!pdev)
|
||||
|
@ -686,15 +715,8 @@ static int _ish_hw_reset(struct ishtp_device *dev)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Now trigger reset to FW */
|
||||
ish_reg_write(dev, IPC_REG_ISH_RMP2, 0);
|
||||
|
||||
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) {
|
||||
/* Disable dma communication between FW and host */
|
||||
if (ish_disable_dma(dev)) {
|
||||
dev_err(&pdev->dev,
|
||||
"Can't reset - stuck with DMA in-progress\n");
|
||||
return -EBUSY;
|
||||
|
|
Loading…
Reference in a new issue