diff options
author | Andy Shevchenko <andriy.shevchenko@linux.intel.com> | 2015-01-21 21:38:10 +0200 |
---|---|---|
committer | Darren Hart <dvhart@linux.intel.com> | 2015-01-28 21:21:10 -0800 |
commit | f0295a36dc31774019be278468e22c254f9626e4 (patch) | |
tree | d12cf699e782c7a6b107842f180c129ffc801428 | |
parent | 7c2e3c74767cf108635d1a5bd9fe014474c61ebf (diff) |
intel_scu_ipc: move error check out of the loop
This is small performance optimization of the busy_loop().
While here, use BIT() macro instead of plain integers when check the status.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Darren Hart <dvhart@linux.intel.com>
-rw-r--r-- | drivers/platform/x86/intel_scu_ipc.c | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/drivers/platform/x86/intel_scu_ipc.c b/drivers/platform/x86/intel_scu_ipc.c index 8938c31be447..e6430a3454cf 100644 --- a/drivers/platform/x86/intel_scu_ipc.c +++ b/drivers/platform/x86/intel_scu_ipc.c @@ -176,21 +176,21 @@ static inline u32 ipc_data_readl(u32 offset) /* Read ipc u32 data */ /* Wait till scu status is busy */ static inline int busy_loop(void) { - u32 status = 0; - u32 loop_count = 0; + u32 status = ipc_read_status(); + u32 loop_count = 100000; - status = ipc_read_status(); - while (status & 1) { + /* break if scu doesn't reset busy bit after huge retry */ + while ((status & BIT(0)) && --loop_count) { udelay(1); /* scu processing time is in few u secods */ status = ipc_read_status(); - loop_count++; - /* break if scu doesn't reset busy bit after huge retry */ - if (loop_count > 100000) { - dev_err(&ipcdev.pdev->dev, "IPC timed out"); - return -ETIMEDOUT; - } } - if ((status >> 1) & 1) + + if (status & BIT(0)) { + dev_err(&ipcdev.pdev->dev, "IPC timed out"); + return -ETIMEDOUT; + } + + if (status & BIT(1)) return -EIO; return 0; @@ -208,8 +208,7 @@ static inline int ipc_wait_for_interrupt(void) } status = ipc_read_status(); - - if ((status >> 1) & 1) + if (status & BIT(1)) return -EIO; return 0; |